outline-mcp-server
A Model Context Protocol server that exposes an Outline knowledge base to MCP clients. It enables searching, reading, writing, and commenting on documents through natural language.
README
outline-mcp-server
A Model Context Protocol server that exposes an Outline knowledge base to MCP clients — Claude Desktop, Claude.ai, ChatGPT Desktop, and others — so you can search, read, write, and comment on your documents through natural language.
It's a thin, near-stateless proxy over Outline's public REST API: point it at an Outline URL and an
API token and it works against any instance, self-hosted or cloud. See
docs/design-spec.md for the full design.
Tools
| Tool | Does | Mode |
|---|---|---|
search_documents |
Full-text search, ranked snippets | read |
get_document |
Fetch one document with its markdown | read |
list_documents |
List docs (by collection / parent / author) | read |
list_collections |
List collections | read |
list_comments |
List comments on a document/collection | read |
whoami |
Current user + team | read |
create_document |
Create a document | write |
update_document |
Edit a document (replace/append/prepend/patch) |
write |
create_comment |
Comment on a document | write |
Set OUTLINE_MCP_READONLY=true to drop all write tools.
Setup
0. Prerequisites (once)
-
Get an Outline API token — in Outline, click your avatar → Settings → API Tokens → New token. Copy it (looks like
ol_api_…). Each person uses their own token; the server only ever acts with that user's permissions. -
Install
uv(a fast Python runner that launches the server):- macOS / Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh - Windows (PowerShell):
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
Then open a new terminal so
uvxis on your PATH. - macOS / Linux:
No clone needed for the recommended method below —
uvxfetches the code from GitHub for you. Only the checkout-based methods (§3 script, §4 Claude Code) needgit clone.
1. Claude Desktop — one command, no clone (recommended)
Set your Outline URL + token, then paste the block for your OS. It writes the outline server into
Claude Desktop's config file (correct per-OS path handled automatically; merges without clobbering
other servers), pointing Claude at the GitHub build via uvx.
macOS / Linux (Terminal):
export OUTLINE_API_URL='https://your-outline.example.com/api'
export OUTLINE_TOKEN='ol_api_PASTE_YOUR_TOKEN'
python3 - <<'PY'
import json, os, platform, shutil
from pathlib import Path
def cfg_path():
s = platform.system()
if s == "Darwin":
return Path.home() / "Library/Application Support/Claude/claude_desktop_config.json"
if s == "Windows":
base = os.environ.get("APPDATA") or (Path.home() / "AppData/Roaming")
return Path(base) / "Claude" / "claude_desktop_config.json"
base = os.environ.get("XDG_CONFIG_HOME") or (Path.home() / ".config")
return Path(base) / "Claude" / "claude_desktop_config.json"
uvx = shutil.which("uvx") or os.path.expanduser("~/.local/bin/uvx")
p = cfg_path(); p.parent.mkdir(parents=True, exist_ok=True)
cfg = json.loads(p.read_text() or "{}") if p.exists() else {}
cfg.setdefault("mcpServers", {})["outline"] = {
"command": uvx,
"args": ["--from", "git+https://github.com/Geoffrey313/outline-mcp", "outline-mcp-server"],
"env": {
"OUTLINE_API_URL": os.environ["OUTLINE_API_URL"],
"OUTLINE_API_TOKEN": os.environ["OUTLINE_TOKEN"],
},
}
p.write_text(json.dumps(cfg, indent=2))
print("Wrote", p, "\nuvx:", uvx)
PY
Windows (PowerShell):
$env:OUTLINE_API_URL='https://your-outline.example.com/api'
$env:OUTLINE_TOKEN='ol_api_PASTE_YOUR_TOKEN'
@'
import json, os, platform, shutil
from pathlib import Path
def cfg_path():
s = platform.system()
if s == "Darwin":
return Path.home() / "Library/Application Support/Claude/claude_desktop_config.json"
if s == "Windows":
base = os.environ.get("APPDATA") or (Path.home() / "AppData/Roaming")
return Path(base) / "Claude" / "claude_desktop_config.json"
base = os.environ.get("XDG_CONFIG_HOME") or (Path.home() / ".config")
return Path(base) / "Claude" / "claude_desktop_config.json"
uvx = shutil.which("uvx") or "uvx"
p = cfg_path(); p.parent.mkdir(parents=True, exist_ok=True)
cfg = json.loads(p.read_text() or "{}") if p.exists() else {}
cfg.setdefault("mcpServers", {})["outline"] = {
"command": uvx,
"args": ["--from", "git+https://github.com/Geoffrey313/outline-mcp", "outline-mcp-server"],
"env": {
"OUTLINE_API_URL": os.environ["OUTLINE_API_URL"],
"OUTLINE_API_TOKEN": os.environ["OUTLINE_TOKEN"],
},
}
p.write_text(json.dumps(cfg, indent=2))
print("Wrote", p, "\nuvx:", uvx)
'@ | python -
Then fully quit Claude Desktop (macOS ⌘Q / Windows: exit from the tray, not just close the window) and reopen. The Outline tools appear under the tools/🔌 icon; local servers are also listed under Settings → Developer.
First launch can be slow (~15–25s) while
uvxdownloads the build the first time — Claude may time out and the server won't show. Fix: pre-warm the cache once in your terminal, then restart Claude:OUTLINE_API_URL='https://your-outline.example.com/api' OUTLINE_TOKEN='ol_api_…' \ "$(command -v uvx)" --from git+https://github.com/Geoffrey313/outline-mcp outline-mcp-serverPress Ctrl-C once you see the
Outline MCP (stdio)line — it's cached now.
To update later: uv cache clean then restart Claude (re-pulls from GitHub).
2. Claude Desktop — interactive script (from a checkout)
If you've cloned the repo, this does the same thing with prompts (and backs up any existing config):
python3 scripts/setup.py # macOS / Linux
python scripts\setup.py # Windows
3. Claude Desktop — manual
Prefer to edit the file yourself? Open the config for your OS and add the outline block below.
| OS | Config file |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| Linux | no official Claude Desktop — use Claude Code (§4) |
{
"mcpServers": {
"outline": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/outline-mcp-server", "outline-mcp-server"],
"env": {
"OUTLINE_API_URL": "https://your-outline.example.com/api",
"OUTLINE_API_TOKEN": "ol_api_…"
}
}
}
}
Replace the path and token, save, then fully quit and reopen Claude Desktop. The Outline tools
appear under the tools/search icon. (After publishing to PyPI, this simplifies to
"command": "uvx", "args": ["outline-mcp-server"].)
4. Claude Code (any OS, including Linux)
One command from the repo folder:
claude mcp add outline \
-e OUTLINE_API_URL=https://your-outline.example.com/api \
-e OUTLINE_API_TOKEN=ol_api_… \
-- uv run --directory "$(pwd)" outline-mcp-server
5. ChatGPT (Desktop or web) — remote connector
ChatGPT connects to hosted (remote) MCP servers only — it can't launch a local process like Claude Desktop can. So you first deploy the server (see Hosted deployment below), then in ChatGPT:
Settings → Connectors → Add / Create (available on paid plans / developer mode) → point it at
your server's URL, e.g. https://outline-mcp.example.com/mcp, and provide your Outline token as
the Bearer credential. macOS and Windows desktop apps use the same connector.
6. Remote server from Claude Desktop (via mcp-remote)
To connect Claude Desktop to a hosted instance instead of running it locally, use the
mcp-remote bridge (needs Node.js):
{
"mcpServers": {
"outline": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://outline-mcp.example.com/mcp",
"--header", "Authorization:Bearer ${OUTLINE_TOKEN}"
],
"env": { "OUTLINE_TOKEN": "ol_api_…" }
}
}
}
(The ${OUTLINE_TOKEN} indirection avoids a header-parsing quirk with spaces in some shells.)
Hosted deployment (Streamable HTTP)
Run one container for a team behind a reverse proxy. Pick exactly one inbound auth strategy:
| Strategy | Set | Clients send | Upstream token |
|---|---|---|---|
| Passthrough (per-user) | MCP_ALLOW_OUTLINE_TOKEN_AUTH=true |
their own Outline token | forwarded per caller |
| Gateway (shared) | MCP_AUTH_TOKEN=<secret> |
the shared secret | OUTLINE_API_TOKEN |
| Open (private nets) | MCP_ALLOW_UNAUTHENTICATED=true |
nothing | OUTLINE_API_TOKEN |
MCP_ALLOWED_HOSTS must be set to the public host(s), e.g. outline-mcp.example.com.
cp .env.example .env # edit it
docker compose up -d --build # joins the external `backend` network as `outline-mcp`
Point your reverse proxy (e.g. Nginx Proxy Manager → http://outline-mcp:9000) at it with
streaming enabled — Streamable HTTP streams SSE-style over plain HTTP (not a WebSocket):
proxy_buffering off;
proxy_request_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
If you front it with Cloudflare on a Tailscale IP, the DNS record must be grey-cloud
(DNS-only) — a 100.x address isn't publicly routable, so Cloudflare can't proxy it. Note that a
Tailscale-only endpoint is reachable by desktop apps on your tailnet, but not by web connectors
(claude.ai / ChatGPT web), which call from outside it.
Configuration
All settings are environment variables — see .env.example for the full list and
defaults. Nothing is hardcoded; everything is centralized in src/outline_mcp/config.py.
Security notes
- Tokens are never written to disk or logged; in passthrough mode they live in a request-scoped context (plus an ephemeral, TTL-bounded session cache for bridges that drop the header).
- The server fails fast at startup on an ambiguous/unusable auth configuration.
- An Outline API token carries its user's full permissions — Outline API keys are not scoped.
Prefer a dedicated token (and, if possible, a limited-permission service user), and use
OUTLINE_MCP_READONLY=truewhere writes aren't needed.
License
TBD (MIT or Apache-2.0) — chosen before the first published release.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。