Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,559Letters: 14Defects: 1,336counted 4 min ago
teppi

Server definition

Hash
sha256:955d212578d125fcd860ae2e87996a040a5a8611f2f8f2d860a8146f93eee44b
What it is
What a remote MCP server returned when asked what it offers: 8 tools

The blob, as servednamed by its sha256

{ "instructions": "sync.day (约时间) collects availability for a fixed-length event, like When2meet. Flow: create_event (or parse_event_text first to turn a sentence into settings) -> share the returned url -> each person calls submit_availability with the start keys they can make -> get_event shows the ranked starts. Slot keys are candidate START times in the form YYYY-MM-DDTHH:MM (naive local time, no timezone). Once 2+ people answered, get_event.voteOptions lists the starts EVERYONE can make; people approve any number of them with vote_time, and the organiser settles it with decide_time (which locks picking and voting until decided with start=null). Identity: submit_availability and vote_time take an `identity` string: a random secret of at least 16 chars that you generate and keep per person (e.g. 32 hex chars) — never a plain user id or name, because anyone who guesses it can act as that person on every event. The server stores only its hash; the same identity later updates the same row, votes need an identity that already submitted at least one start, and names are display only (they may repeat). Keep the adminKey/adminUrl private: it is needed for update_event, remove_participant and decide_time.", "tools": [ { "description": "Create a sync.day availability poll and get its share link. Candidate days run from startDate to endDate (inclusive; or give days instead). Each day offers candidate START times from hourFrom, every startStepMinutes, as long as start + durationMinutes <= hourTo. Returns slug, public url (share this), adminUrl and adminKey (keep private; needed for update_event / remove_participant). Example: 周六周日下午聚餐 3 小时 -> {title:'周末聚餐', startDate:'2026-09-05', endDate:'2026-09-06', hourFrom:13, hourTo:18, durationMinutes:180, startStepMinutes:60}.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "days": { "description": "Number of consecutive days from startDate (1-21); alternative to endDate.", "maximum": 21, "minimum": 1, "type": "integer" }, "durationMinutes": { "anyOf": [ { "const": 30, "type": "number" }, { "const": 60, "type": "number" }, { "const": 90, "type": "number" }, { "const": 120, "type": "number" }, { "const": 180, "type": "number" }, { "const": 240, "type": "number" }, { "const": 480, "type": "number" } ], "description": "Event length in minutes. One of 30, 60, 90, 120, 180, 240, 480." }, "endDate": { "description": "Last candidate day, inclusive, YYYY-MM-DD (same as startDate for a single day; at most 21 days). Give this or days; endDate wins when both are set.", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" }, "hourFrom": { "description": "Earliest hour of each day (0-23). e.g. 9", "maximum": 23, "minimum": 0, "type": "integer" }, "hourTo": { "description": "End of each day's window, exclusive (1-24), must be > hourFrom. e.g. 22", "maximum": 24, "minimum": 1, "type": "integer" }, "question": { "description": "Optional prompt shown to participants, max 200 chars. e.g. 哪天晚上有空?", "maxLength": 200, "type": "string" }, "startDate": { "description": "First candidate day, YYYY-MM-DD. e.g. 2026-09-05", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" }, "startStepMinutes": { "anyOf": [ { "const": 30, "type": "number" }, { "const": 60, "type": "number" } ], "default": 60, "description": "Gap between candidate start times in minutes: 30 or 60 (default 60)." }, "title": { "description": "Event name, max 60 chars. e.g. 周末聚餐, Team sync", "maxLength": 60, "minLength": 1, "type": "string" } }, "required": [ "title", "startDate", "hourFrom", "hourTo", "durationMinutes" ], "type": "object" }, "name": "create_event", "outputSchema": null }, { "description": "Organiser only: settle on a start time (locks availability picking and voting; the page shows 已定). Pass start=null to reopen. Requires the adminKey from create_event.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "adminKey": { "description": "Organiser key returned by create_event (the ?key= part of adminUrl).", "pattern": "^[A-Za-z0-9_-]{12}(?:[A-Za-z0-9_-]{12})?$", "type": "string" }, "slug": { "description": "Event slug from the URL, e.g. calm-otter-4821 (sync.day/calm-otter-4821)", "pattern": "^(?:[a-z]{3,7}-[a-z]{3,7}(?:-\\d{2}|-\\d{4})?|[A-Za-z0-9_-]{10})$", "type": "string" }, "start": { "anyOf": [ { "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$", "type": "string" }, { "type": "null" } ], "description": "A candidate start key of the event (normally one of voteOptions), or null to reopen." } }, "required": [ "slug", "adminKey", "start" ], "type": "object" }, "name": "decide_time", "outputSchema": null }, { "description": "Read an event: settings, every candidate start key per day (startOptions), who has answered (participants with their start keys; names may repeat), the top 10 start times by head-count (ranked), the starts EVERYONE with picks can make with their votes (voteOptions), each person's vote (votes) and decidedStart. No key needed.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "slug": { "description": "Event slug from the URL, e.g. calm-otter-4821 (sync.day/calm-otter-4821)", "pattern": "^(?:[a-z]{3,7}-[a-z]{3,7}(?:-\\d{2}|-\\d{4})?|[A-Za-z0-9_-]{10})$", "type": "string" } }, "required": [ "slug" ], "type": "object" }, "name": "get_event", "outputSchema": null }, { "description": "Turn a natural-language sentence (Chinese works best) into create_event input using sync.day's AI parser. Does NOT create anything; review the result, then call create_event. Example: '下周六或周日下午聚餐,大概 3 小时'.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "text": { "description": "One sentence describing the event, max 300 chars.", "maxLength": 300, "minLength": 1, "type": "string" }, "today": { "description": "Reference date for relative words like 明天/下周, YYYY-MM-DD. Defaults to today in Asia/Shanghai.", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" } }, "required": [ "text" ], "type": "object" }, "name": "parse_event_text", "outputSchema": null }, { "description": "Organiser only: remove one participant by name (the oldest row with that name when it repeats), together with their vote. Requires the adminKey from create_event.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "adminKey": { "description": "Organiser key returned by create_event (the ?key= part of adminUrl).", "pattern": "^[A-Za-z0-9_-]{12}(?:[A-Za-z0-9_-]{12})?$", "type": "string" }, "name": { "description": "Exact participant name to remove.", "maxLength": 20, "minLength": 1, "type": "string" }, "slug": { "description": "Event slug from the URL, e.g. calm-otter-4821 (sync.day/calm-otter-4821)", "pattern": "^(?:[a-z]{3,7}-[a-z]{3,7}(?:-\\d{2}|-\\d{4})?|[A-Za-z0-9_-]{10})$", "type": "string" } }, "required": [ "slug", "name", "adminKey" ], "type": "object" }, "name": "remove_participant", "outputSchema": null }, { "description": "Save (or replace) one person's availability: the candidate start keys they can make, from get_event.startOptions. The person is identified by `identity`, not by name: the same identity later overwrites the same row (and can rename it), a different identity with the same name is a second participant. Keys outside the event's start options are rejected. Returns the updated ranking.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "identity": { "description": "Random secret for this person that you generate and keep per person, 16-256 chars (e.g. 32 hex chars; NOT a plain user id or name, since anyone who guesses it can act as them). Same identity = same participant; the server stores only a hash. Example: 3f9a1c77b2e04d5e8a61f0c9d2b7e415", "maxLength": 256, "minLength": 16, "type": "string" }, "name": { "description": "Display name, 1-20 chars, may repeat. e.g. 小明", "maxLength": 20, "minLength": 1, "type": "string" }, "slug": { "description": "Event slug from the URL, e.g. calm-otter-4821 (sync.day/calm-otter-4821)", "pattern": "^(?:[a-z]{3,7}-[a-z]{3,7}(?:-\\d{2}|-\\d{4})?|[A-Za-z0-9_-]{10})$", "type": "string" }, "starts": { "description": "Start keys like 2026-09-05T14:00. Empty array clears this person's picks.", "items": { "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$", "type": "string" }, "maxItems": 1008, "type": "array" } }, "required": [ "slug", "identity", "name", "starts" ], "type": "object" }, "name": "submit_availability", "outputSchema": null }, { "description": "Organiser only: change any event settings (same fields and rules as create_event; omitted fields keep their current value; endDate wins over days). Existing picks are kept; those no longer valid starts are just hidden.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "adminKey": { "description": "Organiser key returned by create_event (the ?key= part of adminUrl).", "pattern": "^[A-Za-z0-9_-]{12}(?:[A-Za-z0-9_-]{12})?$", "type": "string" }, "days": { "description": "Number of consecutive days from startDate (1-21); alternative to endDate.", "maximum": 21, "minimum": 1, "type": "integer" }, "durationMinutes": { "anyOf": [ { "const": 30, "type": "number" }, { "const": 60, "type": "number" }, { "const": 90, "type": "number" }, { "const": 120, "type": "number" }, { "const": 180, "type": "number" }, { "const": 240, "type": "number" }, { "const": 480, "type": "number" } ], "description": "Event length in minutes. One of 30, 60, 90, 120, 180, 240, 480." }, "endDate": { "description": "Last candidate day, inclusive, YYYY-MM-DD (same as startDate for a single day; at most 21 days). Give this or days; endDate wins when both are set.", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" }, "hourFrom": { "description": "Earliest hour of each day (0-23). e.g. 9", "maximum": 23, "minimum": 0, "type": "integer" }, "hourTo": { "description": "End of each day's window, exclusive (1-24), must be > hourFrom. e.g. 22", "maximum": 24, "minimum": 1, "type": "integer" }, "question": { "description": "Optional prompt shown to participants, max 200 chars. e.g. 哪天晚上有空?", "maxLength": 200, "type": "string" }, "slug": { "description": "Event slug from the URL, e.g. calm-otter-4821 (sync.day/calm-otter-4821)", "pattern": "^(?:[a-z]{3,7}-[a-z]{3,7}(?:-\\d{2}|-\\d{4})?|[A-Za-z0-9_-]{10})$", "type": "string" }, "startDate": { "description": "First candidate day, YYYY-MM-DD. e.g. 2026-09-05", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" }, "startStepMinutes": { "anyOf": [ { "const": 30, "type": "number" }, { "const": 60, "type": "number" } ], "default": 60, "description": "Gap between candidate start times in minutes: 30 or 60 (default 60)." }, "title": { "description": "Event name, max 60 chars. e.g. 周末聚餐, Team sync", "maxLength": 60, "minLength": 1, "type": "string" } }, "required": [ "slug", "adminKey" ], "type": "object" }, "name": "update_event", "outputSchema": null }, { "description": "Approval voting: set every start one person accepts (replaces their earlier approvals; an empty list clears them). The voter is the `identity` used in submit_availability and must have at least one start saved. Only keys listed in get_event.voteOptions are accepted; the error lists the current options otherwise. Rejected once the organiser decided. Example: {slug:'calm-otter-4821', identity:'3f9a1c77b2e04d5e8a61f0c9d2b7e415', starts:['2026-09-05T15:00','2026-09-06T10:00']}. `start` is shorthand for a single-item `starts`.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "identity": { "description": "Random secret for this person that you generate and keep per person, 16-256 chars (e.g. 32 hex chars; NOT a plain user id or name, since anyone who guesses it can act as them). Same identity = same participant; the server stores only a hash. Example: 3f9a1c77b2e04d5e8a61f0c9d2b7e415", "maxLength": 256, "minLength": 16, "type": "string" }, "slug": { "description": "Event slug from the URL, e.g. calm-otter-4821 (sync.day/calm-otter-4821)", "pattern": "^(?:[a-z]{3,7}-[a-z]{3,7}(?:-\\d{2}|-\\d{4})?|[A-Za-z0-9_-]{10})$", "type": "string" }, "start": { "description": "Shorthand for starts: [start]", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$", "type": "string" }, "starts": { "description": "All start keys this person accepts (from get_event.voteOptions); [] clears their approvals", "items": { "description": "Start key, e.g. 2026-09-05T15:00", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$", "type": "string" }, "maxItems": 500, "type": "array" } }, "required": [ "slug", "identity" ], "type": "object" }, "name": "vote_time", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:955d212578d125fcd860ae2e87996a040a5a8611f2f8f2d860a8146f93eee44b | sha256sum