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.
Documents & Files
Section titled “Documents & Files”| Server | Description | Repository |
|---|---|---|
| excel-mcp-server | Read and edit Excel files | github.com/haris-musa/excel-mcp-server |
| office-word-mcp-server | Read and edit Word documents | github.com/GongRzhe/Office-Word-MCP-Server |
| markdown2pdf-mcp | Convert Markdown to PDF | github.com/2b3pro/markdown2pdf-mcp |
| mcp_pdf_reader | Read and analyze PDF files | github.com/karateboss/mcp_pdf_reader |
| pdf-reader-mcp | Read and analyze PDF files | github.com/SylphxAI/pdf-reader-mcp |
| pdfnative-mcp | Create, sign (PAdES), verify and transform PDFs — PDF/A, forms, barcodes | github.com/Nizoka/pdfnative-mcp |
| filesystem | Read and write the local file system | github.com/modelcontextprotocol/servers |
| mcp-server-whisper | Audio transcription via OpenAI Whisper | github.com/arcaputo3/mcp-server-whisper |
| Markdownify MCP Server | Convert web pages, PDFs and documents to Markdown | github.com/zcaceres/markdownify-mcp |
| mcpvault | Read 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
argsdefines 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/filesThe 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:
git clone https://github.com/zcaceres/markdownify-mcpcd markdownify-mcpbun 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.
Productivity & Tasks
Section titled “Productivity & Tasks”| Server | Description | Repository |
|---|---|---|
| mcp-tasks | Task management | github.com/flesler/mcp-tasks |
| mcp-taskmanager | Advanced task management | github.com/kazuph/mcp-taskmanager |
| notion-mcp-server | Read and edit Notion pages and databases | github.com/makenotion/notion-mcp-server |
| caldav-mcp | Calendar via CalDAV (e.g. Nextcloud Calendar) | github.com/dominik1001/caldav-mcp |
| time | Current time and timezone conversion | modelcontextprotocol/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_PATHdefines 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=usernameCALDAV_PASSWORD=passwordThe 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
Communication
Section titled “Communication”| Server | Description | Repository |
|---|---|---|
| email-mcp | Send and receive emails (IMAP + SMTP) | github.com/codefuturist/email-mcp |
| mcp-email-server | Send and receive emails | github.com/ai-zerolab/mcp-email-server |
| ntfy-me-mcp | Send push notifications via ntfy | github.com/gitmotion/ntfy-me-mcp |
| Bluesky Context Server | Read and create Bluesky posts | github.com/brianellin/bsky-mcp-server |
| slack-mcp-server (korotovsky) | Read and write Slack messages and channels | github.com/korotovsky/slack-mcp-server |
| slack-mcp-server (zencoderai) | Read and write Slack messages and channels | github.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.comMCP_EMAIL_PASSWORD=passwordMCP_EMAIL_IMAP_HOST=imap.example.comMCP_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.comMCP_EMAIL_SERVER_FULL_NAME=First LastMCP_EMAIL_SERVER_ACCOUNT_NAME=My Email AccountMCP_EMAIL_SERVER_USER_NAME=user@example.comMCP_EMAIL_SERVER_PASSWORD=passwordMCP_EMAIL_SERVER_IMAP_HOST=imap.example.comMCP_EMAIL_SERVER_IMAP_PORT=993MCP_EMAIL_SERVER_SMTP_HOST=smtp.example.comMCP_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.shNTFY_TOPIC=my-topicFor self-hosted ntfy, set
NTFY_URLto 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.socialBLUESKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxxBLUESKY_SERVICE_URL=https://bsky.socialThe image
bsky-mcp-server:latestmust 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_TOKENmust 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-...Search & Web
Section titled “Search & Web”| Server | Description | Repository |
|---|---|---|
| fetch | Fetch and process web content | modelcontextprotocol/servers |
| brave-search-mcp-server | Web search via Brave Search API | github.com/brave/brave-search-mcp-server |
| exa-mcp-server | AI-powered web search via Exa | github.com/exa-labs/exa-mcp-server |
| duckduckgo-mcp-server | Web search via DuckDuckGo (no API key) | github.com/nickclyde/duckduckgo-mcp-server |
| mcp_weather_server | Retrieve weather data | github.com/isdaniel/mcp_weather_server |
| playwright-mcp | Browser automation and web scraping | github.com/microsoft/playwright-mcp |
| Context7 | Up-to-date library documentation for coding agents | github.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-keyFree 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-sandboxand--disable-dev-shm-usageare 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-keyDevelopment & Code
Section titled “Development & Code”| Server | Description | Repository |
|---|---|---|
| github-mcp-server | Manage GitHub issues, PRs, and repositories | github.com/github/github-mcp-server |
| sequential-thinking | Step-by-step reasoning for complex tasks | modelcontextprotocol/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
Databases
Section titled “Databases”| Server | Description | Repository |
|---|---|---|
| postgres-mcp | Query and manage PostgreSQL databases | github.com/crystaldba/postgres-mcp |
| mcp-server-sqlite | Query and manage SQLite databases | modelcontextprotocol/servers |
| mcp-server-mysql | Query and manage MySQL databases | github.com/benborla/mcp-server-mysql |
| mcp-sqlite | Query and manage SQLite databases | github.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=localhostMYSQL_PORT=3306MYSQL_USER=usernameMYSQL_PASS=passwordMYSQL_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=restrictedlimits write operations and is recommended for production databases. Use--access-mode=unrestrictedfor full access.
Self-Hosting & Infrastructure
Section titled “Self-Hosting & Infrastructure”| Server | Description | Repository |
|---|---|---|
| nextcloud-mcp-server | Manage Nextcloud files and folders | github.com/cbcoutinho/nextcloud-mcp-server |
| paperless-mcp | Paperless-NGX document management | github.com/baruchiro/paperless-mcp |
| jellyfin-mcp | Control a Jellyfin media server — library, playback, playlists | github.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.comNEXTCLOUD_USERNAME=usernameNEXTCLOUD_PASSWORD=app-passwordFirst launch:
uvxdownloads 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.comPAPERLESS_API_KEY=your-api-tokenGenerate 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:8096JELLYFIN_API_KEY=your-api-keyCreate the API key in the Jellyfin dashboard under Administration → API Keys. Use
--read-onlyto restrict to read access,--disable-destructiveto block delete/restart/shutdown.