Skip to content

Compatible MCP Servers

The following MCP servers have been tested with Ontheia and work out of the box.

Note: Using an MCP server that isn’t listed here and it works? Let us know via GitHub Discussions.


ServerDescriptionRepository
excel-mcp-serverRead and edit Excel filesgithub.com/haris-musa/excel-mcp-server
office-word-mcp-serverRead and edit Word documentsgithub.com/GongRzhe/Office-Word-MCP-Server
markdown2pdf-mcpConvert Markdown to PDFgithub.com/2b3pro/markdown2pdf-mcp
mcp_pdf_readerRead and analyze PDF filesgithub.com/karateboss/mcp_pdf_reader
pdf-reader-mcpRead and analyze PDF filesgithub.com/SylphxAI/pdf-reader-mcp
pdfnative-mcpCreate, sign (PAdES), verify and transform PDFs — PDF/A, forms, barcodesgithub.com/Nizoka/pdfnative-mcp
filesystemRead and write the local file systemgithub.com/modelcontextprotocol/servers
mcp-server-whisperAudio transcription via OpenAI Whispergithub.com/arcaputo3/mcp-server-whisper
Markdownify MCP ServerConvert web pages, PDFs and documents to Markdowngithub.com/zcaceres/markdownify-mcp
mcpvaultRead and search an Obsidian vault (Markdown notes)github.com/bitbonsai/mcpvault
⚙ excel-mcp-server — Configuration
{
"mcpServers": {
"excel": {
"command": "uvx",
"args": [
"excel-mcp-server",
"stdio"
]
}
}
}

Allowlist (config/allowlist.packages.pypi): excel-mcp-server

⚙ office-word-mcp-server — Configuration
{
"mcpServers": {
"office-word": {
"command": "uvx",
"args": [
"--from",
"office-word-mcp-server",
"word_mcp_server"
]
}
}
}

Allowlist (config/allowlist.packages.pypi): office-word-mcp-server

⚙ markdown2pdf-mcp — Configuration
{
"mcpServers": {
"markdown2pdf": {
"command": "npx",
"args": [
"--no-install",
"markdown2pdf-mcp"
],
"env": {
"M2P_OUTPUT_DIR": "/path/to/output/directory"
}
}
}
}

Allowlist (config/allowlist.packages.npm): markdown2pdf-mcp

.env:

M2P_OUTPUT_DIR=/path/to/output/directory
⚙ mcp_pdf_reader — Configuration
{
"mcpServers": {
"mcp-pdf-reader": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/karateboss/mcp_pdf_reader@main",
"mcp_pdf_reader"
]
}
}
}

Allowlist (config/allowlist.packages.pypi): git+https://github.com/karateboss/mcp_pdf_reader@main

⚙ pdf-reader-mcp — Configuration
{
"mcpServers": {
"pdf-reader-mcp": {
"command": "npx",
"args": ["-y", "@sylphx/pdf-reader-mcp"]
}
}
}

Allowlist (config/allowlist.packages.npm): @sylphx/pdf-reader-mcp

⚙ pdfnative-mcp — Configuration
{
"mcpServers": {
"pdfnative": {
"command": "npx",
"args": ["-y", "pdfnative-mcp"],
"env": {
"PDFNATIVE_MCP_OUTPUT_DIR": "/path/to/output"
}
}
}
}

Requires Node.js ≥ 22. PDFNATIVE_MCP_OUTPUT_DIR sets where generated PDFs are written. No API keys required — runs fully local.

Allowlist (config/allowlist.packages.npm): pdfnative-mcp

⚙ filesystem — Configuration
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/path/to/directory"
]
}
}
}

Allowlist (config/allowlist.packages.npm): @modelcontextprotocol/server-filesystem

The path in args defines the allowed root directory. Multiple paths can be added as additional arguments.

⚙ mcp-server-whisper — Configuration
{
"mcpServers": {
"whisper": {
"command": "uvx",
"args": ["mcp-server-whisper"],
"env": {
"OPENAI_API_KEY": "secret:OPENAI_API_KEY",
"AUDIO_FILES_PATH": "/path/to/audio/files"
}
}
}
}

Allowlist (config/allowlist.packages.pypi): mcp-server-whisper

.env:

OPENAI_API_KEY=sk-...
AUDIO_FILES_PATH=/path/to/audio/files

The server uses the OpenAI Whisper API to transcribe audio files. An OpenAI API key is required.

⚙ mcpvault — Configuration
{
"mcpServers": {
"mcpvault": {
"command": "npx",
"args": ["@bitbonsai/mcpvault@latest", "/path/to/vault"]
}
}
}

Allowlist (config/allowlist.packages.npm): @bitbonsai/mcpvault

No API key required. The path points to the vault directory (folder with Markdown files). Works without the Obsidian app running.

⚙ Markdownify MCP Server — Configuration

Clone and build the package locally:

Terminal window
git clone https://github.com/zcaceres/markdownify-mcp
cd markdownify-mcp
bun install && bun run build
{
"mcpServers": {
"markdownify": {
"command": "bun",
"args": ["/path/to/markdownify-mcp/dist/index.js"],
"env": {
"MARKITDOWN_PATH": "/path/to/markdownify-mcp/markitdown-uvx.sh"
}
}
}
}

Adjust the paths to the directory where you cloned the repository. Prerequisite: Bun is installed.


ServerDescriptionRepository
mcp-tasksTask managementgithub.com/flesler/mcp-tasks
mcp-taskmanagerAdvanced task managementgithub.com/kazuph/mcp-taskmanager
notion-mcp-serverRead and edit Notion pages and databasesgithub.com/makenotion/notion-mcp-server
caldav-mcpCalendar via CalDAV (e.g. Nextcloud Calendar)github.com/dominik1001/caldav-mcp
timeCurrent time and timezone conversionmodelcontextprotocol/servers
⚙ mcp-tasks — Configuration
{
"mcpServers": {
"mcp-tasks": {
"command": "npx",
"args": ["-y", "mcp-tasks"],
"env": {
"TRANSPORT": "stdio",
"STATUSES": "In Progress,Open,Done,Deferred",
"STATUS_WIP": "In Progress",
"STATUS_DONE": "Done",
"STATUS_TODO": "Open",
"AUTO_WIP": "true",
"KEEP_DELETED": "false",
"PREFIX_TOOLS": "true",
"INSTRUCTIONS": "Use mcp-tasks tools when you want to organize your tasks"
}
}
}
}

Allowlist (config/allowlist.packages.npm): mcp-tasks

⚙ mcp-taskmanager — Configuration
{
"mcpServers": {
"taskmanager": {
"command": "npx",
"args": ["-y", "@kazuph/mcp-taskmanager"],
"env": {
"TASK_MANAGER_FILE_PATH": "/app/logs/tasks.json"
}
}
}
}

Allowlist (config/allowlist.packages.npm): @kazuph/mcp-taskmanager

TASK_MANAGER_FILE_PATH defines where the task file is stored. /app/logs/ is a persistent directory inside the Ontheia container.

⚙ notion-mcp-server — Configuration
{
"mcpServers": {
"notion": {
"command": "npx",
"args": ["-y", "@notionhq/notion-mcp-server"],
"env": {
"NOTION_API_KEY": "secret:NOTION_API_KEY"
}
}
}
}

Allowlist (config/allowlist.packages.npm): @notionhq/notion-mcp-server

.env:

NOTION_API_KEY=ntn_...

Create the integration token at notion.so/my-integrations. Each Notion page the agent should access must be explicitly shared with the integration: open the page → ”…” → “Connections” → select integration.

⚙ caldav-mcp — Configuration
{
"mcpServers": {
"calendar": {
"command": "npx",
"args": ["caldav-mcp"],
"env": {
"CALDAV_BASE_URL": "secret:CALDAV_BASE_URL",
"CALDAV_USERNAME": "secret:CALDAV_USERNAME",
"CALDAV_PASSWORD": "secret:CALDAV_PASSWORD"
}
}
}
}

Allowlist (config/allowlist.packages.npm): caldav-mcp

.env:

CALDAV_BASE_URL=https://nextcloud.example.com/remote.php/dav/calendars/username/calendar-id/
CALDAV_USERNAME=username
CALDAV_PASSWORD=password

The full calendar URL (including calendar ID) can be found in Nextcloud calendar settings under “Internal address”.

⚙ time — Configuration
{
"mcpServers": {
"time": {
"command": "uvx",
"args": [
"mcp-server-time"
]
}
}
}

Allowlist (config/allowlist.packages.pypi): mcp-server-time


ServerDescriptionRepository
email-mcpSend and receive emails (IMAP + SMTP)github.com/codefuturist/email-mcp
mcp-email-serverSend and receive emailsgithub.com/ai-zerolab/mcp-email-server
ntfy-me-mcpSend push notifications via ntfygithub.com/gitmotion/ntfy-me-mcp
Bluesky Context ServerRead and create Bluesky postsgithub.com/brianellin/bsky-mcp-server
slack-mcp-server (korotovsky)Read and write Slack messages and channelsgithub.com/korotovsky/slack-mcp-server
slack-mcp-server (zencoderai)Read and write Slack messages and channelsgithub.com/zencoderai/slack-mcp-server
⚙ email-mcp — Configuration
{
"mcpServers": {
"email-mcp": {
"command": "npx",
"args": [
"-y",
"@codefuturist/email-mcp",
"stdio"
],
"env": {
"MCP_EMAIL_ADDRESS": "secret:MCP_EMAIL_ADDRESS",
"MCP_EMAIL_PASSWORD": "secret:MCP_EMAIL_PASSWORD",
"MCP_EMAIL_IMAP_HOST": "secret:MCP_EMAIL_IMAP_HOST",
"MCP_EMAIL_SMTP_HOST": "secret:MCP_EMAIL_SMTP_HOST"
}
}
}
}

The IMAP and SMTP hosts belong to your own email provider; password and address are kept as secrets.

Allowlist (config/allowlist.packages.npm): @codefuturist/email-mcp

.env:

MCP_EMAIL_ADDRESS=user@example.com
MCP_EMAIL_PASSWORD=password
MCP_EMAIL_IMAP_HOST=imap.example.com
MCP_EMAIL_SMTP_HOST=smtp.example.com
⚙ mcp-email-server — Configuration
{
"mcpServers": {
"zerolib-email": {
"command": "uvx",
"args": [
"mcp-email-server@latest",
"stdio"
],
"env": {
"MCP_EMAIL_SERVER_EMAIL_ADDRESS": "secret:MCP_EMAIL_SERVER_EMAIL_ADDRESS",
"MCP_EMAIL_SERVER_FULL_NAME": "secret:MCP_EMAIL_SERVER_FULL_NAME",
"MCP_EMAIL_SERVER_ACCOUNT_NAME": "secret:MCP_EMAIL_SERVER_ACCOUNT_NAME",
"MCP_EMAIL_SERVER_USER_NAME": "secret:MCP_EMAIL_SERVER_USER_NAME",
"MCP_EMAIL_SERVER_PASSWORD": "secret:MCP_EMAIL_SERVER_PASSWORD",
"MCP_EMAIL_SERVER_IMAP_HOST": "secret:MCP_EMAIL_SERVER_IMAP_HOST",
"MCP_EMAIL_SERVER_IMAP_PORT": "993",
"MCP_EMAIL_SERVER_SMTP_HOST": "secret:MCP_EMAIL_SERVER_SMTP_HOST",
"MCP_EMAIL_SERVER_SMTP_PORT": "465"
}
}
}
}

Allowlist (config/allowlist.packages.pypi): mcp-email-server@latest

.env:

MCP_EMAIL_SERVER_EMAIL_ADDRESS=user@example.com
MCP_EMAIL_SERVER_FULL_NAME=First Last
MCP_EMAIL_SERVER_ACCOUNT_NAME=My Email Account
MCP_EMAIL_SERVER_USER_NAME=user@example.com
MCP_EMAIL_SERVER_PASSWORD=password
MCP_EMAIL_SERVER_IMAP_HOST=imap.example.com
MCP_EMAIL_SERVER_IMAP_PORT=993
MCP_EMAIL_SERVER_SMTP_HOST=smtp.example.com
MCP_EMAIL_SERVER_SMTP_PORT=465
⚙ ntfy-me-mcp — Configuration
{
"mcpServers": {
"ntfy-me-mcp": {
"command": "npx",
"args": ["-y", "ntfy-me-mcp"],
"env": {
"NTFY_URL": "secret:NTFY_URL",
"NTFY_TOPIC": "secret:NTFY_TOPIC"
}
}
}
}

Allowlist (config/allowlist.packages.npm): ntfy-me-mcp

.env:

NTFY_URL=https://ntfy.sh
NTFY_TOPIC=my-topic

For self-hosted ntfy, set NTFY_URL to your own instance.

⚙ Bluesky Context Server — Configuration
{
"mcpServers": {
"bluesky": {
"command": "docker",
"args": [
"run", "--rm", "-i", "--read-only",
"-e", "BLUESKY_IDENTIFIER",
"-e", "BLUESKY_APP_PASSWORD",
"-e", "BLUESKY_SERVICE_URL",
"bsky-mcp-server:latest"
],
"env": {
"BLUESKY_IDENTIFIER": "secret:BLUESKY_IDENTIFIER",
"BLUESKY_APP_PASSWORD": "secret:BLUESKY_APP_PASSWORD",
"BLUESKY_SERVICE_URL": "https://bsky.social"
}
}
}
}

Allowlist (config/allowlist.images): bsky-mcp-server:latest

.env:

BLUESKY_IDENTIFIER=user.bsky.social
BLUESKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx
BLUESKY_SERVICE_URL=https://bsky.social

The image bsky-mcp-server:latest must be built locally against the rootless Docker daemon. Create the app password under Bluesky → Settings → App Passwords.

⚙ slack-mcp-server (korotovsky) — Configuration
{
"mcpServers": {
"slack": {
"command": "npx",
"args": ["-y", "slack-mcp-server", "--transport", "stdio"],
"env": {
"SLACK_MCP_XOXB_TOKEN": "secret:SLACK_MCP_XOXB_TOKEN"
}
}
}
}

Allowlist (config/allowlist.packages.npm): slack-mcp-server

.env:

SLACK_MCP_XOXB_TOKEN=xoxb-...

Required bot token scopes: channels:read, groups:read, im:read, mpim:read, channels:history, users:read. SLACK_MCP_XOXP_TOKEN must not be set — otherwise the server prefers the user token and ignores the bot token.

⚙ slack-mcp-server (zencoderai) — Configuration
{
"mcpServers": {
"slack": {
"command": "npx",
"args": ["-y", "@zencoderai/slack-mcp-server"],
"env": {
"SLACK_BOT_TOKEN": "secret:SLACK_BOT_TOKEN"
}
}
}
}

Allowlist (config/allowlist.packages.npm): @zencoderai/slack-mcp-server

.env:

SLACK_BOT_TOKEN=xoxb-...

ServerDescriptionRepository
fetchFetch and process web contentmodelcontextprotocol/servers
brave-search-mcp-serverWeb search via Brave Search APIgithub.com/brave/brave-search-mcp-server
exa-mcp-serverAI-powered web search via Exagithub.com/exa-labs/exa-mcp-server
duckduckgo-mcp-serverWeb search via DuckDuckGo (no API key)github.com/nickclyde/duckduckgo-mcp-server
mcp_weather_serverRetrieve weather datagithub.com/isdaniel/mcp_weather_server
playwright-mcpBrowser automation and web scrapinggithub.com/microsoft/playwright-mcp
Context7Up-to-date library documentation for coding agentsgithub.com/upstash/context7
⚙ fetch — Configuration
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": [
"mcp-server-fetch"
]
}
}
}

Allowlist (config/allowlist.packages.pypi): mcp-server-fetch

⚙ brave-search-mcp-server — Configuration
{
"mcpServers": {
"brave-search": {
"command": "npx",
"args": ["-y", "@brave/brave-search-mcp-server"],
"env": {
"BRAVE_API_KEY": "secret:BRAVE_API_KEY"
}
}
}
}

Allowlist (config/allowlist.packages.npm): @brave/brave-search-mcp-server

.env:

BRAVE_API_KEY=your-key

Free API key available at brave.com/search/api (2,000 requests/month).

⚙ exa-mcp-server — Configuration
{
"mcpServers": {
"exa": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.exa.ai/mcp?exaApiKey=YOUR_EXA_API_KEY"
]
}
}
}

Allowlist (config/allowlist.packages.npm): mcp-remote

Create your API key at dashboard.exa.ai and insert it directly into the URL.

⚙ duckduckgo-mcp-server — Configuration
{
"mcpServers": {
"ddg-search": {
"command": "uvx",
"args": [
"duckduckgo-mcp-server"
]
}
}
}

Allowlist (config/allowlist.packages.pypi): duckduckgo-mcp-server

DuckDuckGo requires no API key — runs without further configuration.

⚙ mcp_weather_server — Configuration
{
"mcpServers": {
"weather": {
"command": "uvx",
"args": [
"mcp_weather_server"
]
}
}
}

Allowlist (config/allowlist.packages.pypi): mcp_weather_server

⚙ playwright-mcp — Configuration
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"-y",
"playwright-mcp",
"--headless=new",
"--no-sandbox",
"--disable-dev-shm-usage"
]
}
}
}

Allowlist (config/allowlist.packages.npm): playwright-mcp

--no-sandbox and --disable-dev-shm-usage are required in Docker environments. Playwright automatically downloads browser binaries on first run — this may take a few minutes.

⚙ Context7 — Configuration
{
"mcpServers": {
"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp@latest"],
"env": {
"CONTEXT7_API_KEY": "secret:CONTEXT7_API_KEY"
}
}
}
}

Allowlist (config/allowlist.packages.npm): @upstash/context7-mcp@latest

.env:

CONTEXT7_API_KEY=your-key

ServerDescriptionRepository
github-mcp-serverManage GitHub issues, PRs, and repositoriesgithub.com/github/github-mcp-server
sequential-thinkingStep-by-step reasoning for complex tasksmodelcontextprotocol/servers
⚙ github-mcp-server — Configuration
{
"mcpServers": {
"github": {
"command": "docker",
"args": [
"run", "--rm", "-i", "--read-only",
"-e", "GITHUB_PERSONAL_ACCESS_TOKEN",
"ghcr.io/github/github-mcp-server"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "secret:GITHUB_TOKEN"
}
}
}
}

Allowlist (config/allowlist.images): ghcr.io/github/github-mcp-server

.env:

GITHUB_TOKEN=ghp_...

Create the token at GitHub → Settings → Developer settings → Personal access tokens. Required scopes depend on usage: repo, issues, pull_requests.

⚙ sequential-thinking — Configuration
{
"mcpServers": {
"sequential-thinking": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"]
}
}
}

Allowlist (config/allowlist.packages.npm): @modelcontextprotocol/server-sequential-thinking


ServerDescriptionRepository
postgres-mcpQuery and manage PostgreSQL databasesgithub.com/crystaldba/postgres-mcp
mcp-server-sqliteQuery and manage SQLite databasesmodelcontextprotocol/servers
mcp-server-mysqlQuery and manage MySQL databasesgithub.com/benborla/mcp-server-mysql
mcp-sqliteQuery and manage SQLite databasesgithub.com/panasenco/mcp-sqlite
⚙ mcp-server-sqlite — Configuration
{
"mcpServers": {
"sqlite": {
"command": "uvx",
"args": [
"mcp-server-sqlite",
"--db-path",
"/path/to/database.db"
]
}
}
}

Allowlist (config/allowlist.packages.pypi): mcp-server-sqlite

Adjust the path to your SQLite database file in --db-path. The file will be created if it does not exist yet.

⚙ mcp-sqlite — Configuration
{
"mcpServers": {
"sqlite": {
"command": "uvx",
"args": [
"mcp-sqlite",
"/path/to/database.db"
]
}
}
}

Allowlist (config/allowlist.packages.pypi): mcp-sqlite

⚙ mcp-server-mysql — Configuration
{
"mcpServers": {
"mysql": {
"command": "npx",
"args": ["-y", "@benborla29/mcp-server-mysql@latest"],
"env": {
"MYSQL_HOST": "secret:MYSQL_HOST",
"MYSQL_PORT": "3306",
"MYSQL_USER": "secret:MYSQL_USER",
"MYSQL_PASS": "secret:MYSQL_PASS",
"MYSQL_DB": "secret:MYSQL_DB"
}
}
}
}

Allowlist (config/allowlist.packages.npm): @benborla29/mcp-server-mysql

.env:

MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=username
MYSQL_PASS=password
MYSQL_DB=database_name
⚙ postgres-mcp — Configuration
{
"mcpServers": {
"postgres-full": {
"command": "uvx",
"args": [
"postgres-mcp",
"--access-mode=restricted"
],
"env": {
"DATABASE_URI": "secret:DATABASE_URL"
}
}
}
}

Allowlist (config/allowlist.packages.pypi): postgres-mcp

.env:

DATABASE_URL=postgresql://user:password@localhost:5432/dbname

--access-mode=restricted limits write operations and is recommended for production databases. Use --access-mode=unrestricted for full access.


ServerDescriptionRepository
nextcloud-mcp-serverManage Nextcloud files and foldersgithub.com/cbcoutinho/nextcloud-mcp-server
paperless-mcpPaperless-NGX document managementgithub.com/baruchiro/paperless-mcp
jellyfin-mcpControl a Jellyfin media server — library, playback, playlistsgithub.com/jaredtrent/jellyfin-mcp
⚙ nextcloud-mcp-server — Configuration
{
"mcpServers": {
"nextcloud": {
"command": "uvx",
"args": ["nextcloud-mcp-server", "run", "--transport", "stdio"],
"env": {
"NEXTCLOUD_HOST": "secret:NEXTCLOUD_HOST",
"NEXTCLOUD_USERNAME": "secret:NEXTCLOUD_USERNAME",
"NEXTCLOUD_PASSWORD": "secret:NEXTCLOUD_PASSWORD"
}
}
}
}

Allowlist (config/allowlist.packages.pypi): nextcloud-mcp-server

.env:

NEXTCLOUD_HOST=https://nextcloud.example.com
NEXTCLOUD_USERNAME=username
NEXTCLOUD_PASSWORD=app-password

First launch: uvx downloads all dependencies on first start (~150 MB). The launch timeout will be exceeded — but the download continues running in the background. After 2–5 minutes the cache is ready and the server starts immediately on the next attempt.

⚙ paperless-mcp — Configuration
{
"mcpServers": {
"paperless": {
"command": "npx",
"args": ["-y", "@baruchiro/paperless-mcp@latest"],
"env": {
"PAPERLESS_URL": "secret:PAPERLESS_URL",
"PAPERLESS_API_KEY": "secret:PAPERLESS_API_KEY"
}
}
}
}

Allowlist (config/allowlist.packages.npm): @baruchiro/paperless-mcp

.env:

PAPERLESS_URL=https://paperless.example.com
PAPERLESS_API_KEY=your-api-token

Generate the token at Paperless-NGX → Profile → API Token.

⚙ jellyfin-mcp — Configuration
{
"mcpServers": {
"jellyfin": {
"command": "npx",
"args": ["-y", "@jaredtrent/jellyfin-mcp"],
"env": {
"JELLYFIN_URL": "secret:JELLYFIN_URL",
"JELLYFIN_API_KEY": "secret:JELLYFIN_API_KEY"
}
}
}
}

Allowlist (config/allowlist.packages.npm): @jaredtrent/jellyfin-mcp

.env:

JELLYFIN_URL=http://jellyfin.example.com:8096
JELLYFIN_API_KEY=your-api-key

Create the API key in the Jellyfin dashboard under Administration → API Keys. Use --read-only to restrict to read access, --disable-destructive to block delete/restart/shutdown.