SunsamaSAFE
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
A Model Context Protocol (MCP) server that provides comprehensive task management capabilities through the Sunsama API. This server enables AI assistants to access Sunsama tasks, create new tasks, mark tasks complete, and manage your productivity workflow.
Features
Task Management
- Create Tasks - Create new tasks with notes, time estimates, due dates, stream assignments, and GitHub/Gmail integrations
- Read Tasks - Get tasks by day with completion filtering, access backlog tasks, retrieve archived task history
- Update Tasks - Mark tasks as complete with custom timestamps, reschedule tasks or move to backlog
- Subtasks - Add, update, complete, and manage subtasks within tasks
- Delete Tasks - Permanently remove tasks from your workspace
User & Stream Operations
- User Information - Access user profile, timezone, and group details
- Stream Management - Get streams/channels for project organization
- Dual Transport - Support for both stdio and HTTP stream MCP transports
Installation
Prerequisites
- Bun runtime (for development)
- Sunsama account with API access
Using NPX (Recommended)
No installation required! Use directly with:
npx mcp-sunsama
Development Setup
- Clone the repository:
git clone https://github.com/robertn702/mcp-sunsama.git cd mcp-sunsama
- Install dependencies:
bun install
- Set up your environment variables:
cp .env.example .env # Edit .env and add your Sunsama credentials
Environment variables:
SUNSAMA_EMAIL- Your Sunsama account email (required for stdio transport)SUNSAMA_PASSWORD- Your Sunsama account password (required for stdio transport)TRANSPORT_MODE- Transport type:stdio(default) orhttp- `PORT
9d372a679047OBSERVED · 2026-10-08Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add mcp-sunsama --env SUNSAMA_PASSWORD=${SUNSAMA_PASSWORD} --env SUNSAMA_PASSWORD_2=${SUNSAMA_PASSWORD_2} --env SUNSAMA_SESSION_TOKEN=${SUNSAMA_SESSION_TOKEN} -- npx -y [email protected]{
"mcpServers": {
"mcp-sunsama": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"SUNSAMA_PASSWORD": "${SUNSAMA_PASSWORD}",
"SUNSAMA_PASSWORD_2": "${SUNSAMA_PASSWORD_2}",
"SUNSAMA_SESSION_TOKEN": "${SUNSAMA_SESSION_TOKEN}"
}
}
}
}Exposed tools (30)
9 read · 19 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
add-subtask | write | Convenience method to create a subtask with a title in one call (recommended for single subtask creation) |
complete-subtask | read | Mark a subtask as complete with optional completion timestamp |
create-calendar-event | write | Create a new calendar event in Sunsama |
create-subtasks | write | Create multiple subtasks for a task (low-level API for bulk operations) |
create-task | write | Create a new task with optional properties |
delete-task | destructive | Delete a task permanently |
delete-task-bulk | destructive | Delete multiple tasks permanently in a single operation. Individual failures do not block others. |
get-archived-tasks | read | Get archived tasks with optional pagination |
get-streams | read | Get streams for the user |
get-task-by-id | read | Get a specific task by its ID |
get-tasks-backlog | read | Get tasks from the backlog |
get-tasks-by-day | read | Get tasks for a specific day with optional filtering by completion status |
get-user | read | Get current user information including profile, timezone, and group details |
reorder-task | read | Reorder a task within a day by moving it to a specific 0-based position (0 = top) |
uncomplete-subtask | read | Mark a subtask as incomplete (uncomplete it) |
update-calendar-event | write | Update an existing calendar event. Requires the full CalendarEventUpdateData object — fetch the event first to get all required fields. |
update-subtask-title | write | Update the title of a subtask |
update-task-backlog | write | Move a task to the backlog |
update-task-backlog-bulk | write | Move multiple tasks to the backlog in a single operation. Individual failures do not block others. |
update-task-complete | write | Mark a task as complete with optional completion timestamp |
update-task-complete-bulk | write | Mark multiple tasks as complete in a single operation. Individual failures do not block others. |
update-task-due-date | write | Update the due date for a task |
update-task-notes | write | Update the notes content for a task |
update-task-planned-time | write | Update the planned time (time estimate) for a task |
update-task-snooze-date | write | Update task snooze date to reschedule tasks or move them to backlog |
update-task-snooze-date-bulk | write | Reschedule multiple tasks to a specific date in a single operation. Individual failures do not block others. |
update-task-stream | write | Update the stream/channel assignment for a task |
update-task-text | write | Update the text/title of a task |
update-task-uncomplete | write | Mark a completed task as incomplete |
update-task-uncomplete-bulk | write | Mark multiple completed tasks as incomplete in a single operation. Individual failures do not block others. |
Trust audit
SAFEgrade B · trust 88/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (1 observation(s))
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (7)
delete-task, delete-task-bulk
import { parseBasicAuth } from "../../../src/auth/http.js";import { getSessionConfig } from "../../../src/config/session-config.js";import { SessionManager } from "../../../src/session/session-manager.js";import type { SessionData } from "../../../src/auth/types.js";"../../../node_modules/sunsama-api/dist/types/client",
@types/papaparse, cors, express, papaparse, @changesets/cli, @types/bun, @types/cors, @types/express
Gates applied: no_behavioural_pass.
9d372a679047full audit observations/trust-audit/mcp-server/robertn702__sunsama.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | 9d372a679047 | SAFE | B | 88 | first audit |
Questions
What tools does Sunsama expose?
30 in total: 9 read-only, 19 that write, and 2 that can delete or overwrite (delete-task, delete-task-bulk). Every one is listed on this page with its risk.
Is Sunsama safe to connect to an agent?
The audit found nothing in the source that contradicts what it says it does, and graded it B (88/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does Sunsama need?
It reads SUNSAMA_PASSWORD, SUNSAMA_PASSWORD_2 and SUNSAMA_SESSION_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does Sunsama run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as mcp-sunsama at 0.19.1.
How current is this page?
The grade is for one exact copy of the source (9d372a679047), read on 2026-10-08. The repository is watched and re-audited when it changes.