// 00 — MCP REFERENCES
MCP REFERENCES
wspc exposes its agent surface — todo, calendar, email, projects, org — through a single remote MCP server at https://mcp.wspc.ai/mcp. Any host that speaks MCP (Claude Desktop, Hermes, Cursor, a custom orchestrator) can register the URL, complete the OAuth handshake once, and then read and write the same workspace a human would through the web console.
This page is a scanning surface: which tools exist, what each does in one line, what a typical agent call looks like. The live tools/list response is the authoritative schema — fetch it any time the prose here disagrees.
// 01 — CONNECTION
CONNECTION
Point your MCP host at the server below. Step-by-step instructions for Hermes and Claude Desktop — including the OAuth browser flow and the 6-digit email magic code — live in QUICKSTART.
| Field | Value |
|---|---|
| Name | wspc |
| URL | https://mcp.wspc.ai/mcp |
| Transport | SSE (Server-Sent Events over HTTPS) |
| Auth | OAuth 2.1 Remote Flow |
The server advertises tools capabilities only. List tools with the standard tools/list request once the host has a valid bearer token.
// 02 — AUTHENTICATION
AUTHENTICATION
Every MCP request carries Authorization: Bearer <token>. Tokens come from the OAuth 2.1 remote flow — dynamic client registration, browser-driven authorization, and an email magic code for proof of identity. The MCP host runs the dance on first connect and again whenever the access token expires.
When a request arrives without a token, or with one the server cannot verify, the response is 401 Unauthorized with a WWW-Authenticate header pointing at https://mcp.wspc.ai/.well-known/oauth-protected-resource. MCP hosts that support OAuth discovery use that URL to relaunch the flow automatically.
The single issued scope is wspc:full — root-level access for the authenticated user. Finer-grained scopes are not available yet.
// 03 — TOOLS
TOOLS
Fifty-nine tools across six domains. Each one accepts a JSON object input and returns either a structured result or an isError payload with a stable error code. The summaries below are intentionally short — fetch tools/list for full input schemas, required fields, and the exact error codes each tool can return.
TODO
Tasks with hierarchy, status, due dates, optimistic locking, and project-scoped types with custom fields.
| Tool | Summary |
|---|---|
todo_get | Get one todo by id. |
todo_list | List todos. Filter by status, due window, project, parent, user. |
todo_create | Create a todo. Parent, due date, status, type, custom fields. |
todo_update | Update a todo. Partial; optional expected_version optimistic lock. |
todo_delete | Soft-delete a todo. Optional cascade to descendants. |
todo_restore | Restore a soft-deleted todo. Optional cascade. |
todo_type_create | Create a todo type with optional custom-field schema. |
todo_type_list | List todo types in a project. |
todo_type_get | Get one type with its schema and version. |
todo_type_update | Update a type’s label, hidden core fields, or custom-field schema. |
todo_type_delete | Soft-delete a type. The current default type cannot be deleted. |
todo_type_restore | Restore a soft-deleted type. |
todo_rule_create | Create a recurring todo rule from an RFC 5545 RRULE. Optional type_id; omit to adopt the project’s default type. The type’s custom-field defaults are copied onto every instance; a required field with no default fails with MISSING_REQUIRED_FIELD. |
todo_rule_get | Get one recurrence rule with its template todo snapshot (type_id + custom fields) and the count of materialized instances. |
todo_rule_list | List active recurring rules. Each item includes type_id (derived from the rule’s template). |
todo_rule_delete | Delete a recurrence rule. Stops future materialization and soft-deletes the template; already-materialized instances are kept. Optional expected_version optimistic lock. Destructive. |
todo_comment_create | Add a comment to a todo. Fields: todo_id, content (max 10 000 chars). Author is the authenticated user. |
todo_comment_list | List comments on a todo. Fields: todo_id, optional order (asc | desc, default asc), optional include_deleted. |
todo_comment_update | Edit a comment’s content. Fields: id, content. |
todo_comment_delete | Soft-delete a comment. Fields: id. No restore path. |
CALENDAR
Events with attendees, ISO 8601 datetimes, RFC 5545 iCalendar export, and optimistic locking.
| Tool | Summary |
|---|---|
calendar_get_event | Get one calendar event by id. |
calendar_list_events | List events. Filter by date range, free-text query, deleted, past. |
calendar_get_event_ics | Return RFC 5545 iCalendar text for one event. |
calendar_create_event | Create an event. ISO 8601 times, attendees, all-day. |
calendar_update_event | Update fields of an event. Optional expected_version optimistic lock. |
calendar_delete_event | Soft-delete an event. Recoverable. |
calendar_restore_event | Restore a soft-deleted event. |
Inbound mail under user-controlled aliases, outbound send with attachments, batch read / unread / delete.
| Tool | Summary |
|---|---|
email_list | List received emails. Cursor pagination (default 20, max 100). |
email_get | Get one email by id. Text body by default; pass include_html for HTML source. |
email_mark_read | Mark one or more emails as read. |
email_mark_unread | Mark one or more emails as unread. |
email_delete | Batch soft-delete emails (move to trash). |
email_restore | Batch restore soft-deleted emails. |
email_attachment_get | Download an attachment by index. Returns base64; max 5 MB. |
email_send | Send a plain-text email from a user alias. Custom-domain aliases route through pete-mail when sending_status = verified. New, reply, or re-attach inbound files. |
EMAIL ALIASES
Up to 10 active aliases per account. Alias identifiers are full email addresses under @wspc.app or a fully verified organization custom domain. Deletion stops new mail; history is preserved.
| Tool | Summary |
|---|---|
email_alias_create | Create an alias under @wspc.app or a fully verified organization custom domain. Up to 10 active aliases per account. |
email_alias_list | List the user’s aliases. Active only by default. |
email_alias_delete | Soft-delete an alias. Stops accepting new mail; existing emails preserved. |
email_alias_restore | Re-enable a deleted alias. Counts toward the 10-alias limit. |
EMAIL DOMAINS
Register organization custom domains and manage DNS verification records. Custom domains can be used for aliases once status, sending_status, and receiving_status are all verified. Custom-domain inbound delivery is handled by the operator-managed pete-mail webhook; there is no MCP tool for webhook registration.
DNS records may include a purpose hint such as identity_verification, dkim, mail_from, or receiving_mx so operators know why each record is required.
| Tool | Input | Summary |
|---|---|---|
email_domain_create | { domain } | Register a domain and return the DNS records the organization must set. |
email_domain_list | {} | List registered domains for the caller’s organization. |
email_domain_get | { domain } | Get one registered domain, including cached DNS records and status. |
email_domain_verify | { domain } | Ask the provider to verify current DNS records and return the result. |
PROJECTS
Org-scoped containers for todos. Each project defines a default todo type for new work.
| Tool | Summary |
|---|---|
todo_project_get | Get one project by id. |
todo_project_list | List projects in the caller’s organization. |
todo_project_create | Create a project in the caller’s organization. |
todo_project_update | Update project attributes (name, default todo type). |
todo_project_delete | Soft-delete a project. |
todo_project_restore | Restore a soft-deleted project. |
ORG
Organization metadata. In v1 every user belongs to a single personal organization.
| Tool | Summary |
|---|---|
auth_org_get | Get metadata for the authenticated user’s organization. |
auth_org_members_list | List organization members (paginated). v1 returns just the caller. |
auth_org_rename | Rename the authenticated user’s organization. |
auth_org_invite_create | Invite an email to your organization (sends an invite email). |
auth_org_invites_list | List invites issued by your organization. |
auth_org_invite_revoke | Revoke a pending invite. |
auth_invites_list | List invites addressed to your email. |
auth_invite_accept | Accept an invite (switches your organization; previous-org data becomes invisible). |
auth_invite_reject | Reject an invite. |
auth_org_member_remove | Remove a member from the organization (or leave). |
Member Removal Tool Details
- Tool Name:
auth_org_member_remove - Description: Remove a member from the authenticated user’s organization, or leave the organization (self-removal).
- Input Parameters:
id(string, required): The ID of the user to be removed (e.g.usr_01KT4FF78A1F9CT5SWN5HK392F).
- Usage & Safety Warning:
- Revert Behavior: Removing a member reverts their active organization back to their previous organization (
previous_org_id). - Self-Removal (Leave): Any user (except the creator of the organization) can remove themselves, which is semantically equivalent to leaving the organization.
- Creator Protection: The creator of the organization (
created_by_user_id) cannot be removed. - Revert Constraint: A user cannot be removed if their
previous_org_idis null, protecting against “homeless” states.
- Revert Behavior: Removing a member reverts their active organization back to their previous organization (
// 04 — EXAMPLES
EXAMPLES
Three sketches of what an agent does when a human asks it something natural. The shape — utterance, tool call, a note — repeats. The tool names and field names track real MCP inputs; the exact JSON the host sends is what tools/list describes.
Schedule a lunch
“Book lunch with Alice tomorrow at 12:30, one hour, at Taipei HQ. Her email is [email protected].”
calendar_create_event({
title: "Lunch with Alice",
start: "2026-05-27T12:30:00+08:00",
end: "2026-05-27T13:30:00+08:00",
location: "Taipei HQ",
attendees: [{ email: "[email protected]", display_name: "Alice" }]
})
start and end are ISO 8601 datetimes with offset. The agent resolves the user’s “tomorrow” against the local timezone before constructing the call; the server itself only accepts ISO. An iCalendar invite is dispatched to the attendee on creation.
Triage the open backlog
“What todos do I still have open this week?”
todo_list({
status: ["open", "in_progress"],
due_after: "2026-05-26",
due_before: "2026-06-02"
})
The agent maps “this week” to a half-open [due_after, due_before) window and filters by the two active statuses. Both bounds are date-only ISO strings; due_after is inclusive, due_before is exclusive.
Clear the unread queue
“Mark all my unread emails as read.”
email_list({ unread_only: true })
// → [{ id: "em_abc123", ... }, { id: "em_def456", ... }]
email_mark_read({ ids: ["em_abc123", "em_def456"] })
email_list returns unread items in cursor-paginated batches (default 20, max 100). email_mark_read takes a batch of ids in one call. If the inbox has more than limit unread emails, the agent re-calls email_list with the returned next_cursor until exhausted.
Recurring task with a checklist
“Every morning I do a standup: write notes, then post the summary. Set that up as a daily task.”
todo_rule_create({
title: "Daily standup",
rrule: "FREQ=DAILY",
dtstart: "2026-06-10",
project_id: "prj_abc"
})
// → { rule: { id: "tdr_xyz" }, template_todo_id: "tod_tmpl", ... }
todo_create({ title: "Write notes", parent_id: "tod_tmpl", project_id: "prj_abc" })
todo_create({ title: "Post summary", parent_id: "tod_tmpl", project_id: "prj_abc" })
A rule owns a hidden template todo. To make the same subtasks appear on every occurrence, the agent attaches them to the template — not to one day’s instance. The template id comes back as template_todo_id from todo_rule_create (or as template.id from todo_rule_get). Adding a child under the template re-materializes future occurrences so each daily todo carries the checklist. Subtasks are one level deep; attaching to a specific day’s instance would only affect that day.
// 05 — REFERENCE
REFERENCE
- Live
tools/list—POST https://mcp.wspc.ai/mcpwith atools/listJSON-RPC body. Returns the canonical name, description, and JSON Schema input for every registered tool. Treat the response as the source of truth whenever this page disagrees. - HTTP equivalents — every MCP tool here maps to one or more REST endpoints documented in API REFERENCES.
- CLI equivalents — the same surface from a terminal lives in CLI REFERENCE.
- Setup walkthrough — Hermes prompt pack and the manual Claude Desktop connector flow are in QUICKSTART.