@fswap/mcp-outline
An MCP server for Outline that lets Claude Desktop, Claude Code, Cursor and other MCP clients search, read, create and update your wiki.
Runs locally over stdio. No install step — clients launch it with npx.
Quick start
-
Create an API token in Outline under Settings → API.
-
Run the interactive setup once:
npx -y @fswap/mcp-outline@latest setupIt asks for your Outline URL and token, verifies them against
auth.info, and stores them in your OS config directory (mode0600). -
Add the server to your client. At the end,
setupoffers to do this for you in Claude Code, Claude Desktop, Cursor and Codex: clients it finds are pre-selected (except Claude Code when Claude Desktop is installed, because the desktop app's Code tab already loadsclaude_desktop_config.json), an existingoutlineentry is only replaced after you confirm, and any config file it changes gets a one-time.bakcopy.To add it by hand instead, use the snippets below. Every value asked in
setupcan be skipped with Enter; anything you skip goes into theenvblock instead.setup --printshows these snippets again at any time.Claude Desktop (
claude_desktop_config.json) and Cursor (~/.cursor/mcp.jsonor<project>/.cursor/mcp.json):{ "mcpServers": { "outline": { "command": "npx", "args": ["-y", "@fswap/mcp-outline@latest"] } } }Codex (
~/.codex/config.toml):[mcp_servers.outline] command = "npx" args = ["-y", "@fswap/mcp-outline@latest"]Claude Code:
claude mcp add outline -- npx -y @fswap/mcp-outline@latest
Without setup (environment variables)
Environment variables take precedence over the config file, so you can skip setup entirely (or skip individual values in it and set them here):
{
"mcpServers": {
"outline": {
"command": "npx",
"args": ["-y", "@fswap/mcp-outline@latest"],
"env": {
"OUTLINE_URL": "https://app.getoutline.com",
"OUTLINE_API_TOKEN": "ol_api_..."
}
}
}
}
Codex equivalent:
[mcp_servers.outline]
command = "npx"
args = ["-y", "@fswap/mcp-outline@latest"]
[mcp_servers.outline.env]
OUTLINE_URL = "https://app.getoutline.com"
OUTLINE_API_TOKEN = "ol_api_..."
Tools
API errors are returned to the model as isError results rather than crashing the server.
Development
TypeScript source in src/, bundled to dist/ with tsdown. Only dist/ is published.
npm install
npm run build # tsdown → dist/index.js
npm run lint # eslint (typescript-eslint)
npm run typecheck # tsc --noEmit
npm test # builds, then spawns the server and checks the tool list
npm run check # all of the above (also runs on prepublishOnly)
OUTLINE_URL=... OUTLINE_API_TOKEN=... npm run inspect # MCP Inspector UI against dist/
Never write to stdout from server code — it is the protocol channel. Use console.error.
Reset
npx -y @fswap/mcp-outline@latest setup --reset
License
MIT