Last updated

// 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.

FieldValue
Namewspc
URLhttps://mcp.wspc.ai/mcp
TransportSSE (Server-Sent Events over HTTPS)
AuthOAuth 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.

ToolSummary
todo_getGet one todo by id.
todo_listList todos. Filter by status, due window, project, parent, user.
todo_createCreate a todo. Parent, due date, status, type, custom fields.
todo_updateUpdate a todo. Partial; optional expected_version optimistic lock.
todo_deleteSoft-delete a todo. Optional cascade to descendants.
todo_restoreRestore a soft-deleted todo. Optional cascade.
todo_type_createCreate a todo type with optional custom-field schema.
todo_type_listList todo types in a project.
todo_type_getGet one type with its schema and version.
todo_type_updateUpdate a type’s label, hidden core fields, or custom-field schema.
todo_type_deleteSoft-delete a type. The current default type cannot be deleted.
todo_type_restoreRestore a soft-deleted type.
todo_rule_createCreate 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_getGet one recurrence rule with its template todo snapshot (type_id + custom fields) and the count of materialized instances.
todo_rule_listList active recurring rules. Each item includes type_id (derived from the rule’s template).
todo_rule_deleteDelete a recurrence rule. Stops future materialization and soft-deletes the template; already-materialized instances are kept. Optional expected_version optimistic lock. Destructive.
todo_comment_createAdd a comment to a todo. Fields: todo_id, content (max 10 000 chars). Author is the authenticated user.
todo_comment_listList comments on a todo. Fields: todo_id, optional order (asc | desc, default asc), optional include_deleted.
todo_comment_updateEdit a comment’s content. Fields: id, content.
todo_comment_deleteSoft-delete a comment. Fields: id. No restore path.

CALENDAR

Events with attendees, ISO 8601 datetimes, RFC 5545 iCalendar export, and optimistic locking.

ToolSummary
calendar_get_eventGet one calendar event by id.
calendar_list_eventsList events. Filter by date range, free-text query, deleted, past.
calendar_get_event_icsReturn RFC 5545 iCalendar text for one event.
calendar_create_eventCreate an event. ISO 8601 times, attendees, all-day.
calendar_update_eventUpdate fields of an event. Optional expected_version optimistic lock.
calendar_delete_eventSoft-delete an event. Recoverable.
calendar_restore_eventRestore a soft-deleted event.

EMAIL

Inbound mail under user-controlled aliases, outbound send with attachments, batch read / unread / delete.

ToolSummary
email_listList received emails. Cursor pagination (default 20, max 100).
email_getGet one email by id. Text body by default; pass include_html for HTML source.
email_mark_readMark one or more emails as read.
email_mark_unreadMark one or more emails as unread.
email_deleteBatch soft-delete emails (move to trash).
email_restoreBatch restore soft-deleted emails.
email_attachment_getDownload an attachment by index. Returns base64; max 5 MB.
email_sendSend 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.

ToolSummary
email_alias_createCreate an alias under @wspc.app or a fully verified organization custom domain. Up to 10 active aliases per account.
email_alias_listList the user’s aliases. Active only by default.
email_alias_deleteSoft-delete an alias. Stops accepting new mail; existing emails preserved.
email_alias_restoreRe-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.

ToolInputSummary
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.

ToolSummary
todo_project_getGet one project by id.
todo_project_listList projects in the caller’s organization.
todo_project_createCreate a project in the caller’s organization.
todo_project_updateUpdate project attributes (name, default todo type).
todo_project_deleteSoft-delete a project.
todo_project_restoreRestore a soft-deleted project.

ORG

Organization metadata. In v1 every user belongs to a single personal organization.

ToolSummary
auth_org_getGet metadata for the authenticated user’s organization.
auth_org_members_listList organization members (paginated). v1 returns just the caller.
auth_org_renameRename the authenticated user’s organization.
auth_org_invite_createInvite an email to your organization (sends an invite email).
auth_org_invites_listList invites issued by your organization.
auth_org_invite_revokeRevoke a pending invite.
auth_invites_listList invites addressed to your email.
auth_invite_acceptAccept an invite (switches your organization; previous-org data becomes invisible).
auth_invite_rejectReject an invite.
auth_org_member_removeRemove 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_id is null, protecting against “homeless” states.

// 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/listPOST https://mcp.wspc.ai/mcp with a tools/list JSON-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.