{"$schema":"https://static.modelcontextprotocol.io/schemas/server-card.json","name":"io.presify/presify","title":"Presify","description":"Microsoft Teams presence analytics for the connected workspace: who is online now, presence history and summaries, team coverage, connection health, and flagged presence patterns. Every tool is read-only and scoped to what the connected person may see in Presify.","version":"26.9.4","serverUrl":"https://app.presify.io/api/mcp","websiteUrl":"https://presify.io/docs/ai-assistants","documentationUrl":"https://presify.io/docs/ai-assistants","openapiUrl":"https://presify.io/openapi.json","versioningPolicyUrl":"https://presify.io/docs/api-versioning","iconUrl":"https://presify.io/icon.svg","icons":[{"src":"https://presify.io/icon.svg","mimeType":"image/svg+xml","sizes":["any"]},{"src":"https://presify.io/apple-icon.png","mimeType":"image/png","sizes":["180x180"]}],"protocolVersion":"2026-07-28","transport":{"type":"streamable-http","endpoint":"https://app.presify.io/api/mcp","responseMode":"json"},"capabilities":{"tools":{"listChanged":false},"prompts":{"listChanged":false},"resources":{"subscribe":false,"listChanged":false}},"authentication":{"type":"oauth2","authorizationServer":"https://app.presify.io","authorizationServerMetadata":"https://app.presify.io/.well-known/oauth-authorization-server","protectedResourceMetadata":"https://app.presify.io/.well-known/oauth-protected-resource/api/mcp","grantTypes":["authorization_code","refresh_token"],"pkce":"S256","dynamicClientRegistration":"https://app.presify.io/api/oauth/register","scopes":["presify:read"],"unauthenticatedMethods":["initialize","ping","resources/list","resources/templates/list","resources/read"],"alternatives":[{"type":"bearer","description":"Personal access token minted by a Presify owner or admin in Settings, then Connections (365-day lifetime, revocable)."}]},"remotes":[{"type":"streamable-http","url":"https://app.presify.io/api/mcp","headers":[{"name":"Authorization","description":"Bearer <OAuth access token or personal access token>","isRequired":true,"isSecret":true},{"name":"MCP-Protocol-Version","description":"Negotiated protocol revision (YYYY-MM-DD); the server serves 2026-07-28 and older supported revisions.","isRequired":false,"isSecret":false}]}],"tools":[{"name":"get_workspace_info","title":"Workspace overview","description":"Returns the connected Presify workspace at a glance: workspace name, plan tier with seat and retention limits, subscription and trial state, monitored-user counts (active, paused, pending enrollment), presence-collection health, and what the connected person may see. Call this first to orient yourself.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"title":"Workspace overview","readOnlyHint":true}},{"name":"list_monitored_users","title":"Monitored people","description":"Lists the people monitored in this Presify workspace with their status, department, timezone, business hours, and flags (collection paused, legal hold). Filter by monitoring status (active by default; former users appear under removed statuses), department, or a name/email search. Paginated: up to 200 per page with offset. Use this to find a person before calling per-user tools.","inputSchema":{"type":"object","properties":{"status":{"description":"Monitoring status filter. Defaults to active (currently monitored people).","type":"string","enum":["active","removed_from_group","deleted_in_tenant","manually_removed","stopped_eu_uk_location"]},"department":{"description":"Exact department name.","type":"string","minLength":1,"maxLength":200},"query":{"description":"Case-insensitive substring match on display name or email (UPN).","type":"string","minLength":1,"maxLength":200},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50},"offset":{"type":"integer","minimum":0,"maximum":100000,"default":0}},"additionalProperties":false},"annotations":{"title":"Monitored people","readOnlyHint":true}},{"name":"get_user","title":"Person overview","description":"Returns one monitored person: profile (name, email, department, timezone, business hours, monitoring status, flags), their latest presence reading, and their last 7 daily presence totals. Accepts a name, email, or Microsoft user id. For deeper trends use get_user_stats.","inputSchema":{"type":"object","properties":{"user":{"description":"Who: a Microsoft user id, email (UPN), or display name.","type":"string","minLength":1,"maxLength":200}},"additionalProperties":false,"required":["user"]},"annotations":{"title":"Person overview","readOnlyHint":true}},{"name":"get_user_stats","title":"Person deep stats","description":"Computes rich presence statistics for one person over the last 14 weeks (bounded by plan retention): this week and month with honest same-elapsed-point comparisons to the prior period, a weekly trend, business-hours versus after-hours split, typical day rhythm (median start and end, drift), uninterrupted focus blocks, meeting time, state mix, and longest online stretch. Accepts a name, email, or Microsoft user id.","inputSchema":{"type":"object","properties":{"user":{"description":"Who: a Microsoft user id, email (UPN), or display name.","type":"string","minLength":1,"maxLength":200}},"additionalProperties":false,"required":["user"]},"annotations":{"title":"Person deep stats","readOnlyHint":true}},{"name":"get_user_timeline","title":"Person day timeline","description":"Returns one person's presence timeline for one local calendar day: ordered segments with local start and end times, duration in seconds, and the presence status held in each (\"Available\", \"Busy\", \"In a call\", \"Away\", \"Offline\", and so on). \"No data\" marks spans where collection was not running, which is different from a confirmed Offline reading. Times are wall-clock in the person's own timezone; the response names the zone and the business-hours window. Days outside the plan retention window return no segments.","inputSchema":{"type":"object","properties":{"user":{"description":"Who: a Microsoft user id, email (UPN), or display name.","type":"string","minLength":1,"maxLength":200},"date":{"description":"The local calendar day to show, YYYY-MM-DD.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"additionalProperties":false,"required":["user","date"]},"annotations":{"title":"Person day timeline","readOnlyHint":true}},{"name":"get_current_presence","title":"Who is online now","description":"Returns the latest Microsoft Teams presence reading for each actively monitored person: availability, activity, presence bucket, when it last changed, and whether they count as online right now (fresh reading within the last few minutes). Includes data-freshness info so you can caveat stale results. Optionally filter by department. Up to 500 people per call.","inputSchema":{"type":"object","properties":{"department":{"description":"Exact department name.","type":"string","minLength":1,"maxLength":200},"limit":{"type":"integer","minimum":1,"maximum":500,"default":200}},"additionalProperties":false},"annotations":{"title":"Who is online now","readOnlyHint":true}},{"name":"get_presence_summary","title":"Presence summary","description":"Sums presence time over a date range from nightly per-person daily rollups, grouped by person or by day. Returns seconds in each presence bucket (online, away, offline or no signal, in a call or presenting). Use for questions like \"how much was the team online last week\" or \"show daily totals for June\". Range up to 366 days; optionally restrict to specific people (Microsoft user ids) or one department. Days outside the plan retention window have no data.","inputSchema":{"type":"object","properties":{"from":{"description":"Start date, YYYY-MM-DD (inclusive).","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"description":"End date, YYYY-MM-DD (inclusive).","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"group_by":{"description":"Aggregate per person or per calendar day.","type":"string","enum":["user","day"]},"users":{"description":"Restrict to these Microsoft user ids (from list_monitored_users).","type":"array","items":{"type":"string","minLength":1,"maxLength":80},"minItems":1,"maxItems":50},"department":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false,"required":["from","to","group_by"]},"annotations":{"title":"Presence summary","readOnlyHint":true}},{"name":"compare_users","title":"Compare people","description":"Compares 2 to 10 people side by side over a date range using whole-day presence totals from the nightly rollups: online, away, offline or no signal, and in-call seconds, plus days with data and daily averages. Range up to 92 days. Each entry accepts a name, email, or Microsoft user id. Note: totals are whole-day (not clipped to business hours); the in-app Compare page offers business-window clipping.","inputSchema":{"type":"object","properties":{"users":{"description":"The people to compare: names, emails, or Microsoft user ids.","type":"array","items":{"type":"string","minLength":1,"maxLength":200},"minItems":2,"maxItems":10},"from":{"description":"Start date, YYYY-MM-DD (inclusive).","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"description":"End date, YYYY-MM-DD (inclusive).","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"additionalProperties":false,"required":["users","from","to"]},"annotations":{"title":"Compare people","readOnlyHint":true}},{"name":"get_coverage","title":"Team coverage grid","description":"Builds a typical-week coverage grid: for each weekday hour, how many of the selected people are typically online (fractional headcount and percent of team), plus best and thinnest hours. Answers \"when is the team reachable\" and \"where are our coverage gaps\". Hard caps: at most 31 days of history and 50 people per call; scope the users list or department for bigger teams. Requires a plan with the Coverage feature.","inputSchema":{"type":"object","properties":{"from":{"description":"Window start, YYYY-MM-DD (inclusive).","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"description":"Window end, YYYY-MM-DD (inclusive).","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"users":{"description":"Restrict to these people (names, emails, or Microsoft user ids).","type":"array","items":{"type":"string","minLength":1,"maxLength":200},"minItems":1,"maxItems":50},"department":{"type":"string","minLength":1,"maxLength":200},"include_weekends":{"type":"boolean","default":false}},"additionalProperties":false,"required":["from","to"]},"annotations":{"title":"Team coverage grid","readOnlyHint":true}},{"name":"get_connection_health","title":"Microsoft 365 connection health","description":"Reports the health of this workspace connection to Microsoft 365: whether presence collection is running (active, delayed, paused for reconsent, or suspended), the last successful poll time, how reliably Microsoft Graph has been answering over the chosen window (overall and per day), and when the Microsoft app credential expires. Use when data looks missing or stale, or for an operations checkup. Window up to 90 days.","inputSchema":{"type":"object","properties":{"days":{"description":"Graph responsiveness window in days (clamped to the workspace age).","type":"integer","minimum":1,"maximum":90,"default":30}},"additionalProperties":false},"annotations":{"title":"Microsoft 365 connection health","readOnlyHint":true}},{"name":"list_notifications","title":"Workspace notices","description":"Lists recent in-app workspace notices for admins: billing events, connection health changes, enrollment reminders, digest highlights. Up to 50, newest first; optionally unread only. Useful for \"anything needing attention in Presify?\".","inputSchema":{"type":"object","properties":{"unread_only":{"type":"boolean","default":false},"limit":{"type":"integer","minimum":1,"maximum":50,"default":20}},"additionalProperties":false},"annotations":{"title":"Workspace notices","readOnlyHint":true}},{"name":"list_anomalies","title":"Flagged presence patterns","description":"Lists flagged presence patterns (anomalies) with factual descriptions of what was measured: unbroken Available runs, missing idle time, overnight presence, no activity variation, robotic regularity, weekend uniformity. Filter by person, pattern type, date range, or open/dismissed. Up to 200, newest first. Descriptions state the observed pattern and computation only, never a cause or intent. To inspect a flagged day the way the app does, follow up with get_user_timeline using the entry's person and date.","inputSchema":{"type":"object","properties":{"user":{"description":"Restrict to one person: Microsoft user id (from list_monitored_users).","type":"string","minLength":1,"maxLength":200},"type":{"type":"string","enum":["unbroken_available","idle_suppression","overnight_presence","zero_activity_diversity","robotic_regularity","weekend_uniformity"]},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"status":{"type":"string","enum":["open","dismissed","all"],"default":"open"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false},"annotations":{"title":"Flagged presence patterns","readOnlyHint":true}},{"name":"get_anomaly_summary","title":"Flagged-pattern summary","description":"Counts flagged presence patterns by type over a date range (open and dismissed separately), with the latest detection per type. Use for triage and trend questions like \"are overnight flags increasing\". Range up to 366 days.","inputSchema":{"type":"object","properties":{"from":{"description":"Start date, YYYY-MM-DD (inclusive).","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"description":"End date, YYYY-MM-DD (inclusive).","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"additionalProperties":false,"required":["from","to"]},"annotations":{"title":"Flagged-pattern summary","readOnlyHint":true}},{"name":"list_reports","title":"Generated reports","description":"Lists recently generated report jobs (PDF scorecards and Excel workbooks): type, status, who requested them, when. Up to 50, newest first. Use get_report_download for a finished report file link.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":50,"default":20}},"additionalProperties":false},"annotations":{"title":"Generated reports","readOnlyHint":true}},{"name":"get_report_download","title":"Report download link","description":"Returns a fresh download link for a completed report by reportId (from list_reports). Links are valid for 15 minutes and are generated per request; ask again if one expires.","inputSchema":{"type":"object","properties":{"reportId":{"type":"string","format":"uuid"}},"additionalProperties":false,"required":["reportId"]},"annotations":{"title":"Report download link","readOnlyHint":true}},{"name":"list_scheduled_reports","title":"Scheduled reports","description":"Lists this workspace recurring report schedules: report type, cadence in plain words, window, recipients, status, and the next run time. Answers \"when does my next report go out\".","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"title":"Scheduled reports","readOnlyHint":true}},{"name":"list_audit_events","title":"Audit trail","description":"Lists this workspace audit trail: who did what and when (settings changes, enrollments, report requests, connections). Filter by action prefix or date range. Up to 100, newest first. Owner only, on plans with the audit log feature.","inputSchema":{"type":"object","properties":{"action_prefix":{"description":"Filter to actions starting with this prefix, e.g. \"enrollment.\" or \"mcp.\".","type":"string","minLength":1,"maxLength":80},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":50}},"additionalProperties":false},"annotations":{"title":"Audit trail","readOnlyHint":true}},{"name":"search","title":"Search this workspace","description":"Searches this Presify workspace across monitored people (name, email, department), flagged presence patterns, and generated reports. Returns up to 20 results with namespaced ids for fetch. Built for research-style clients; prefer the specific tools when you know what you need.","inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":300}},"additionalProperties":false,"required":["query"]},"annotations":{"title":"Search this workspace","readOnlyHint":true}},{"name":"fetch","title":"Fetch a search result","description":"Fetches the full record behind a search result id (user:, anomaly:, or report: prefixed). Companion to search for research-style clients.","inputSchema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false,"required":["id"]},"annotations":{"title":"Fetch a search result","readOnlyHint":true}}],"resources":[{"uri":"https://presify.io/llms.txt","name":"llms-txt","title":"Presify site index for AI assistants (llms.txt)","description":"What Presify is, when to use it and when not to, how an agent calls it, and links to every public page and machine-readable document.","mimeType":"text/plain"},{"uri":"https://presify.io/docs","name":"documentation","title":"Presify documentation","description":"Setup, the Microsoft Graph permissions Presify uses, data handling, how presence is collected, and the anomaly patterns it flags.","mimeType":"text/markdown"},{"uri":"https://presify.io/docs/ai-assistants","name":"ai-assistants-guide","title":"Connect an AI assistant to Presify (MCP)","description":"Per-assistant setup for Claude, ChatGPT, Copilot Studio and other MCP clients, what the connector can answer, revocation, and the developer resources.","mimeType":"text/markdown"},{"uri":"https://presify.io/docs/api-versioning","name":"api-versioning-policy","title":"Presify API versioning and deprecation policy","description":"Permanent paths, MCP-Protocol-Version negotiation, and the Deprecation plus Sunset headers a retirement carries at least 90 days ahead.","mimeType":"text/markdown"},{"uri":"https://presify.io/openapi.json","name":"openapi","title":"Presify public API (OpenAPI 3.1)","description":"The public machine surface: OAuth 2.0 endpoints, the MCP endpoint and its tool catalog, discovery documents, health probes, rate-limit headers, versioning policy.","mimeType":"application/json"}],"resourcesNote":"Public documentation, readable with resources/read before authentication. Each URI is the same document on the website.","toolsNote":"Full catalog. The live tools/list varies by plan and role; call tools/list after initialize rather than assuming every tool here is available to the connected person.","rateLimits":{"documentation":"https://presify.io/openapi.json","headers":["RateLimit-Policy","RateLimit","Retry-After"]},"contact":{"url":"https://presify.io/contact","email":"support@presify.io"}}