Simplepush MCP Server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SP_KEYS | No | Personal encryption keys, comma-separated list. A bare base64 key is the Personal Password key; topic=key binds a key to a topic. | |
| SP_BASE_URL | No | API origin. Point at http://localhost:8000 for local development. | https://api.simplepu.sh |
| SP_MCP_PORT | No | Listen port for the hosted HTTP transport. | 8787 |
| SP_API_TOKEN | No | Personal API token from the app. Required for personal mode. | |
| SP_OAUTH_ISSUER | No | Origin of the authorization server, as clients see it. | https://api.simplepu.sh |
| SP_CANONICAL_URI | No | Public URL clients reach this server at, e.g. https://mcp.simplepu.sh/mcp. Tokens are audience-bound to it. Required for hosted HTTP transport. | |
| SP_AUTH_SERVER_URL | No | Where this server reaches the authorization server for token introspection. Defaults to SP_OAUTH_ISSUER. | https://api.simplepu.sh |
| SP_MAX_WAIT_SECONDS | No | Ceiling on how long send_task may block. Per-call wait_seconds is clamped to it. | 900 |
| SP_POLL_INTERVAL_MS | No | Gap between answer polls while blocking. | 2000 |
| SP_INTEGRATION_TOKEN | No | Org integration token from `sp integration create`. Required for organization mode. | |
| SP_INTROSPECTION_SECRET | No | Bearer for the AS introspection endpoint. Must match the backend's oauth.introspectionSecret. Required for hosted HTTP transport. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| send_notificationA | Send a push notification to phones. A notification lives only in the banner: once dismissed it is gone, so it suits alerts and heads-ups, not questions that must be answered. It can still carry one |
| send_taskA | Create a task on people's phones and wait for the answers. |
| append_subtaskA | Add a follow-up question or checklist item to a task sent with send_task. Pass the append_token from that result: a task's token appends to that one task; a group's token appends to every instance of the group (narrow with |
| cancel_taskA | Withdraw something sent earlier: pass a task_id (tsk_...), subtask_id (sub_...) or group_id (grptsk_...). Pending recipients see it as canceled and can no longer answer; answers already given stay. Canceling a group cancels every still-pending instance and reports how many were already finished. Not undoable. |
| get_task_answerA | Check whether a task sent with send_task, or a subtask added with append_subtask, has been answered. Pass exactly one of task_id or subtask_id. Returns the answer, or pending if the person has not replied yet; for a subtask the result also names its parent task. A photo, voice or file answer carries its inputId for download_attachment. For the whole task including every subtask, use get_task. |
| get_notification_answerA | Check whether a notification sent with send_notification and an |
| query_tasksA | Answers 'which tasks are open, expired, declined or done, and who has them'. Status only — it never shows what people answered or reported; for that use get_task, query_events or get_activity. One page of compact summaries, newest first: id, title, tag, topic, status, recipients, input kinds and reply mode (what sort of answer it expects), attachment kinds (file, link), sent time, and a per-status count of the task's subtasks (checklist items). Filter by status, time window, topic, member, or group. |
| get_taskA | Answers 'what exactly was asked and answered on this task'. The full content of one task and every subtask appended to it: the questions, the answers given, replies, declines, and the uploads (inputId) and reply files (id) for download_attachment. Use after query_tasks or get_activity has identified the task. A task sent to several people carries its grptsk_ groupId — follow it with get_group_status for the other recipients' copies. |
| get_group_statusA | Answers 'who has answered and who has not' for a task sent to several people as independent copies (a grptsk_ group id, as shown on tasks from query_tasks): one summary per recipient plus a count per status. |
| query_eventsA | Answers 'what happened' — the place to look for anything reported, answered, replied, declined or cancelled, oldest first, each with who did it and when. This is where problems surface; query_tasks does not contain them. Defaults to the last 7 days. Filter by member or by event type (TaskCompleted, TaskInputCompleted, SubtaskCompleted, ReplyAppended, SubmissionCreated, TaskDeclinedByRecipient, TaskCanceled, TaskExpired, ...). For a ready-made bundle per member use get_activity; for ad-hoc reports alone use query_submissions. |
| query_submissionsA | Answers 'did anyone report something on their own' — reports people sent without being asked (not answers to a task): text, photo, file, voice note, location, with who sent it and when. Check this whenever a question is about problems or reports; the task index never shows these. Oldest first; defaults to the last 7 days. Photos and files carry their id for download_attachment (scope_id = the sbm_ id). |
| search_knowledgeA | Full-text and location search over everything this credential reads — the organization's records, or what a personal account sent and submitted: task titles and content, answers, replies, notifications and their answers, and ad-hoc submissions — across all time, ranked. Use it for 'anything about X?', 'what was said about X?', 'who mentioned X?'. Words match literally, and by stem in the languages the organization configured (so 'leak' finds 'leaking' only where stemming is on); several words must all appear; quote a phrase for adjacency. For 'what happened around ?' pass center/radius_meters instead of (or on top of) the query: alone they return the location answers, replies and submissions recorded within the radius, nearest first; with a query, text hits are kept only when their task or submission carries an in-radius point. For a shape rather than a circle — a site, a block, a stretch of road — pass area_points, a polygon of 3 to 50 corners, instead; those hits carry no distance and come newest first. Resolve a street or site name to coordinates yourself first, and prefer a generous radius when the coordinates are geocoded rather than known. Each hit carries the id to read in full (tsk_/sub_ with get_task, grptsk_ — a task sent to several people — with get_group_status, ntf_ with get_notification_answer, sbm_ with query_submissions) and a snippet with the matching words in brackets (a location hit carries its point and distance instead). Encrypted records are not searchable. |
| get_activityA | Use this first for 'any problems with ?', 'what is going on with / at the site?', 'catch me up', 'anything I should know?'. One call returns the bundle: open tasks, tasks that were declined or expired, and the window's answers, replies, declines, cancellations and ad-hoc submissions — with who and when. Defaults to the last 7 days. Omit member for the whole organization. |
| download_attachmentA | Fetches a photo, voice recording or file by the id of what holds it and the id of the file, the same pair the SDK's download takes. Images come back inline so you can look at them; other files come back as a short-lived download URL plus metadata. Needs the 'files:read' scope. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |