Conatus MCP Server
Conatus MCP Server
An independently installable Model Context Protocol server for the self-hosted Conatus task manager.
It exposes agent-safe tools for projects, sections, tasks, labels, comments and reminders. It supports local stdio clients and remote Streamable HTTP clients. Permanent deletion is intentionally not exposed.
Requirements
Node.js 20 or newer
A reachable Conatus installation with the
/api/v1APIA scoped API token created in Settings → API tokens
Related MCP server: Google Tasks MCP Server
Local stdio setup
The local mode is the recommended default. The AI host starts one MCP process for the configured task-manager account.
One-command setup
Run the interactive installer to validate your Conatus URL and scoped API token, then register the server with Claude Desktop, Claude Code, Cursor, or another JSON MCP configuration file:
npx -y conatus-mcp setupThe installer never echoes the token, verifies it before changing a config file, and restricts the written configuration file to owner-only permissions where the operating system supports them. Restart the chosen client when it finishes. The direct configuration below remains the non-interactive fallback.
{
"mcpServers": {
"my-tasks": {
"command": "npx",
"args": ["-y", "conatus-mcp"],
"env": {
"TASKS_BASE_URL": "https://tasks.example.com",
"TASKS_API_TOKEN": "tdm_replace_me"
}
}
}
}For a local development installation, use http://localhost:3000 as TASKS_BASE_URL.
You can also install the package once:
npm install --global conatus-mcp
conatus-mcpRemote Streamable HTTP mode with browser OAuth
Use OAuth when an agent needs to connect by URL. The MCP server acts as a single-user gateway: its scoped TASKS_API_TOKEN identifies the task workspace, while each AI client receives a separate short-lived OAuth token. The task token never leaves the server.
TASKS_BASE_URL=https://tasks.example.com \
TASKS_API_TOKEN=tdm_replace_me \
MCP_HOST=0.0.0.0 \
MCP_PORT=3001 \
MCP_PUBLIC_URL=https://mcp.example.com/mcp \
MCP_OAUTH_PASSWORD='use-a-long-separate-approval-password' \
MCP_OAUTH_STORE_PATH=/var/lib/task-mcp/oauth-store.json \
MCP_ALLOWED_ORIGINS=https://your-ai-host.example \
conatus-mcp-httpGive the AI client only https://mcp.example.com/mcp. A compatible client discovers the protected-resource metadata, dynamically registers itself, opens the approval page and completes an OAuth authorization-code flow with S256 PKCE. Enter MCP_OAUTH_PASSWORD in that page to approve it.
The server issues one-hour access tokens and rotating 30-day refresh tokens. OAuth client registrations and token hashes are stored in the file at MCP_OAUTH_STORE_PATH with mode 0600; raw OAuth tokens and the approval password are not stored. Run one MCP replica per store file. For multiple replicas, replace the JSON store with a shared transactional store first.
Put TLS and a reverse proxy in front of port 3001. MCP_PUBLIC_URL must be the exact external endpoint and end in /mcp. Production URLs must use HTTPS. Requests carrying an Origin header are accepted only when the origin is listed in MCP_ALLOWED_ORIGINS; native clients commonly send no Origin.
Domain and reverse proxy
The task app and MCP gateway can use separate addresses:
https://tasks.example.com→ the web app and/api/v1https://mcp.example.com/mcp→ this child MCP service
Create DNS records for both names, terminate TLS at your proxy and forward mcp.example.com to port 3001. Only the proxy should expose that port. The OAuth metadata, registration, authorization, token, revocation, approval and MCP endpoints all share the MCP origin.
Static bearer fallback
For clients that cannot perform OAuth, omit MCP_PUBLIC_URL and MCP_OAUTH_PASSWORD, then set MCP_BEARER_TOKEN to a long random value. Connect to /mcp and send that value as a bearer token. This is less convenient to rotate per client and should not be pasted into prompts.
Binding to a non-loopback address without either complete OAuth configuration or MCP_BEARER_TOKEN is rejected.
Docker
Released images are published to ghcr.io/nojusmorkunas/conatus-mcp. Build locally only when working on the server itself:
docker build -t conatus-mcp .
docker run --rm -p 127.0.0.1:3001:3001 \
-v task-mcp-oauth:/data \
-e TASKS_BASE_URL=https://tasks.example.com \
-e TASKS_API_TOKEN=tdm_replace_me \
-e MCP_HOST=0.0.0.0 \
-e MCP_PUBLIC_URL=https://mcp.example.com/mcp \
-e MCP_OAUTH_PASSWORD='use-a-long-separate-approval-password' \
-e MCP_OAUTH_STORE_PATH=/data/oauth-store.json \
conatus-mcpEnvironment variables
Variable | Required | Default | Purpose |
| yes | none | Task-manager origin without |
| yes | none |
|
| no |
| Upstream API timeout |
| HTTP only |
| HTTP bind address |
| HTTP only |
| HTTP port |
| no | task-manager origin | Comma-separated browser origins |
| OAuth mode | none | Exact public HTTPS MCP URL ending in |
| OAuth mode | none | Separate 16+ byte password entered on the approval page |
| no |
| Persistent OAuth registrations and token hashes |
| bearer mode | none | Static fallback credential clients use to access MCP |
Do not put tokens in prompts, tool arguments, source control or command-line arguments. Environment variables keep them out of MCP messages and most process listings.
To revoke one OAuth client, let that client call the advertised revocation endpoint. To revoke every connected client, stop the service and remove its OAuth store file, then restart; all clients must connect again. Revoke or rotate TASKS_API_TOKEN in task-manager Settings if the gateway itself is compromised.
Tools
Workspace:
get_workspace_contextProjects:
list_projects,get_project,create_project,update_projectSections:
create_section,update_sectionTasks:
list_tasks,get_task,create_task,quick_add_task,update_task,move_task,complete_task,reopen_task,set_task_labelsLabels:
list_labels,create_labelCollaboration:
add_commentScheduling:
set_reminder
Create operations use idempotency keys so retries do not create duplicate tasks. Task and comment content is returned as structured user data and must not be treated as agent instructions.
Resources
taskapp://workspacetaskapp://views/todaytaskapp://views/upcomingtaskapp://projects/{id}taskapp://tasks/{id}
Development
npm install
npm test
npm run build
npm run devTest the built stdio server with MCP Inspector:
TASKS_BASE_URL=http://localhost:3000 \
TASKS_API_TOKEN=tdm_replace_me \
npx @modelcontextprotocol/inspector node dist/cli.jsReleasing
Publishing a GitHub release builds ghcr.io/nojusmorkunas/conatus-mcp for linux/amd64 and linux/arm64, then publishes the npm package. Both come from the released commit, so a release either produces both artifacts or neither.
Tag the release vX.Y.Z matching package.json; the npm job refuses to publish a mismatch. Mark prereleases as such on GitHub and they go to the beta dist-tag, leaving latest on the newest stable release.
npm publishing uses trusted publishing, so this repository stores no npm token. It requires a one-time configuration on the package's npmjs.com settings page linking it to this repository and the Publish release workflow.
To publish by hand instead:
npm publish --tag latest # or --tag beta for a prereleaseName the dist-tag explicitly. npm rejects a bare npm publish for any version with a semver prerelease suffix, which every 0.x.y-beta.z has.
prepublishOnly reruns the test, lint and build checks. publishConfig.access is already set, so no --access flag is needed.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Manage tasks, Focus Zone, notes, projects, and task history from compatible AI assistants.
Task management for people and AI agents, with scoped OAuth access to issues, projects, and docs.
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides Todoist task management capabilities to AI assistants through the Model Context Protocol. Enables users to interact with their Todoist projects and tasks directly through Claude Desktop using natural language commands.33259MIT
- AlicenseNot gradedqualityDmaintenanceIntegrates with Google Tasks to enable searching, listing, creating, and managing tasks through the Model Context Protocol. It allows users to perform CRUD operations on tasks and clear completed items using the Google Tasks API.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Google Tasks (list, create, complete, delete tasks) through the Model Context Protocol.02MIT
- AlicenseNot gradedqualityFmaintenanceEnables language models to manage Todoist tasks, projects, sections, labels, comments, and collaborators through natural language via the Model Context Protocol.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nojusmorkunas/conatus-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server