Find a meeting time
Use Fragab to prepare a meeting poll for Tuesday at 10:00, Wednesday at 14:00 and Friday at 11:00 next week, in Europe/Berlin. Give me the private preview and draft an invitation.
Fragab MCP server
Plan a meeting, collect preferences or compare ideas. Ask your assistant to prepare a Fragab poll, then share one link with your group.
Participants vote in Fragab. They do not need an AI assistant or a Fragab account unless you choose a login restriction.
Add this server address to ChatGPT, Claude or another compatible MCP assistant.
Start with a private preview, even without a Fragab account or paid package. Publishing requires a verified email address and any package needed by your selected features.
Use Fragab to prepare a meeting poll for Tuesday at 10:00, Wednesday at 14:00 and Friday at 11:00 next week, in Europe/Berlin. Give me the private preview and draft an invitation.
Prepare a Fragab poll for our team outing: bowling, a picnic or an escape room. Let everyone choose more than one option. Draft a short invitation with only the participant link.
Show my Fragab polls, read the results of the meeting poll and explain which dates work best. Mention any ties and draft a message to the group.
fragab-chatgpt, without a client secret. Complete the connection and install the plugin in your conversation.fragab-claude, without a client secret.These steps use a custom connection. Availability and menu names depend on your assistant and workspace. Local development addresses are for local testing; hosted assistants need the public server address. If your assistant shows a different callback, see the technical reference before connecting.
Open the private preview link yourself. Review the prepared poll, verify your email in Fragab and activate it when everything is ready. Until then, other visitors cannot see the poll or cast real votes.
Connect your Fragab account to list polls, publish eligible drafts, read results and close a poll when you decide. You approve access and can revoke it at any time.
Keep the private preview link to yourself. Share only the participant link after publication. Your assistant can draft invitations and summaries; it does not automatically send them.
Read the Markdown reference · Information for AI agents
Create polls, share a participant link, review aggregated results and close your own polls from an AI assistant.
Server endpoint: https://fragab.com/mcp
Transport: stateless Streamable HTTP, JSON-RPC 2.0. Send POST requests with Content-Type: application/json and Accept: application/json, text/event-stream. GET streams and session resumption are not offered. A GET to the endpoint returns 405.
The operator must first register each application's exact HTTPS callback URI and public client ID. This server uses pre-registered public OAuth clients with PKCE S256 and token endpoint authentication method none. It does not offer automatic client registration or published client-identity document lookup. Do not substitute a legacy REST API secret or a shared user token.
ChatGPT: open Plugins, choose Add custom MCP server and enter this endpoint. For both guest previews and connected account tools, choose OAuth or no authentication and supply the pre-registered client ID. Copy the callback displayed by the current client into the operator's exact callback allowlist. Public-client setup, callback and mixed-auth behavior must be verified in the hosted pilot before advertising the connection as supported.
Claude: open Customize > Connectors, Add > Custom > Web and enter the same endpoint. Select Sign in when needed and Use your own OAuth client with the pre-registered client ID. Register the exact callback shown by the current client. Published identity and automatic registration are not enabled on this server. The hosted pilot must verify public-client PKCE and guest-to-account behavior.
The endpoint must be reachable over public HTTPS from the provider's servers. A local development URL is not a hosted connection. Availability and workspace permissions depend on the client and account. Hosting and a private custom connection do not automatically add Fragab to a public directory.
Platform setup references, checked 2026-10-27:
https://developers.openai.com/api/docs/guides/custom-mcp-server#how-to-use
https://support.claude.com/en/articles/11176164-use-connectors-to-extend-claude-s-capabilities
create_poll saves a private proof of concept without an account or paid package. Supported premium settings remain in the preview. This does not publish the poll.
The response contains poll_url, preview_url, status, activation_requirements and a secret request_key for retrying this creation. Share only poll_url with participants. Keep preview_url and request_key private; do not include them in an invitation.
Open preview_url in your browser and explicitly continue to claim the draft once. The token is in the URL fragment to avoid sending it in HTTP request URLs. GET requests and link previews never claim a poll. Whoever first claims an unused guest link obtains its preview access; the assistant's user identity cannot be proven without prior authentication.
Other browsers see only that the poll has not been activated. The creator can edit the prepared content and use the existing email-code and package flow to publish the same poll with the same participant link. No productive votes or notifications are sent during preview. Losing a guest session before proving ownership cannot be recovered from the participant link alone.
If a draft is already owned by your connected Fragab account, sign in to that same account and open its normal poll link. The private preview offers an explicit continuation that restores the current saved draft into the existing creator. This requires current account ownership and does not recover an unowned guest draft from its public link.
Do not enter verification codes in the AI chat. Email verification takes place in Fragab's browser flow and does not authorize the assistant.
Protected tools require a separately approved Fragab account connection using Authorization Code with PKCE S256, scopes and resource binding. Legacy API client-credentials tokens are not end-user grants. Authorization discovery uses the issuer and protected-resource metadata under /.well-known/.
Scopes: polls:read, polls:results:read, polls:create, polls:publish, polls:close. The resource parameter must exactly match the server endpoint. The user can revoke grants at /mcp/connections. Access tokens expire and refresh tokens rotate; refresh replay revokes the grant.
create_poll defaults to a PoC. publish=true requires both creation and publication scopes, a verified current email and current package rights. If activation requirements remain, the poll stays private. publish_poll acts only on an owned draft. Feature removal is never implicit. Some browser-only upload/repeat preparations require finishing in the browser.
create_poll: prepare a saved draft and return its normal and private links.
list_polls / get_poll: inspect your own drafts and live polls.
publish_poll: explicitly activate an owned draft when prerequisites are satisfied.
get_poll_results: read aggregates and an explainable recommendation. No participant names, contacts, comments or private free text are returned.
close_poll: explicitly close an owned live poll, optionally selecting an eligible option. Repeating the same close does not send duplicate notifications. It does not change an already closed winner.
Example: prepare three meeting options in the intended IANA timezone, preview and publish, write an invitation containing only the participant link, later read results, explain ties and on explicit instruction close the poll and write a final message. The assistant writes summaries and invitations itself; Fragab does not need another model call and does not send these messages automatically.
Simple option polls rank by yes votes, then maybe votes, retaining all ties. Without positive votes there is no recommendation. Yes/no polls, quantities and waiting lists require their own interpretation. Responses include the snapshot timestamp, stored dates/timezone and participant count. Never invent the number of invited people or weight unnamed participants.
Unknown settings, malformed dates/timezones and unsupported poll types are rejected. Local start/end times that do not exist or occur twice during a clock change are rejected before saving. Fragab currently stores wall times without UTC offsets; an otherwise unique instant is also rejected if conversion makes it ambiguous in the storage zone. Ask the user for a time outside the affected interval. Do not silently select an offset. Calendar-only options remain calendar dates. Body, option, creation, claim and verification budgets protect the service. Retry creation with the same secret request_key and identical arguments; changed content conflicts and consumed claims are never reissued.
Basic creation, basic publication, aggregate results and manual close have no AI surcharge. Existing Gold/Platinum rights apply at publication, not at preview creation. Participants keep the normal registration-free flow unless the creator explicitly chooses supported access restrictions.
Use HTTPS. Keep private links and credentials out of logs, analytics, prompts and shared invitations. The public tool catalog never includes private Control tools. Read the site's privacy policy before granting an AI provider access to your own polls.
Operators provision migrations and registered OAuth clients before enabling production flags. Verify the guest and account flows in both ChatGPT and Claude and submit public listings separately. Production hosting, platform reviews and actual client tests are separate release gates.
Contract version: 1.0.0. Documentation and tool schemas are generated from the same public catalog. Each tool declares an outputSchema; successful structuredContent is checked server-side against its declared contract. Contact Fragab through the website's contact page for support.
[
{
"name": "create_poll",
"description": "Save a complete private poll preview, retaining supported premium settings without a package. Returns a participant URL and a separate private one-time browser link. Does not publish by default. Use publish=true only on explicit user instruction with publication authorization.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 30
},
"description": {
"type": "string",
"maxLength": 2000
},
"type": {
"type": "string",
"enum": [
"options",
"yes_no"
]
},
"timezone": {
"type": "string",
"maxLength": 100
},
"options": {
"type": "array",
"maxItems": 400,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 200
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"time_start": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"time_end": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
}
}
}
},
"settings": {
"type": "object",
"additionalProperties": false,
"properties": {
"vote_maybe": {
"type": "boolean"
},
"vote_no": {
"type": "boolean"
},
"vote_multiple": {
"type": "boolean"
},
"vote_hidden": {
"type": "boolean"
},
"hide_names": {
"type": "boolean"
},
"hide_comments": {
"type": "boolean"
},
"no_comments": {
"type": "boolean"
},
"login_required": {
"type": "boolean"
},
"waiting_list": {
"type": "boolean"
},
"ongoing_list": {
"type": "boolean"
},
"one_click": {
"type": "boolean"
},
"vote_binding": {
"type": "boolean"
},
"chat": {
"type": "boolean"
},
"guest": {
"type": "boolean"
},
"live": {
"type": "boolean"
},
"max_voters": {
"type": "integer",
"minimum": 0,
"maximum": 100000
},
"vote_min": {
"type": "integer",
"minimum": 0,
"maximum": 100000
},
"vote_one": {
"type": "integer",
"minimum": 0,
"maximum": 100000
},
"list_password": {
"type": "string",
"maxLength": 100
}
}
},
"publish": {
"type": "boolean"
},
"request_key": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"title",
"type",
"timezone"
]
},
"outputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"key": {
"type": "string",
"pattern": "^[A-Za-z0-9]{5,12}$"
},
"poll_url": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"poc",
"live",
"closed"
]
},
"closed": {
"type": "boolean"
},
"title": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"type": {
"type": "integer"
},
"timezone": {
"type": "string"
},
"preview_url": {
"type": [
"string",
"null"
]
},
"request_key": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"activation_requirements": {
"type": "object",
"additionalProperties": false,
"properties": {
"email_verification": {
"type": "boolean"
},
"packages": {
"type": "array",
"items": {
"type": "string",
"enum": [
"gold",
"platin"
]
}
},
"browser_publication": {
"type": "boolean"
},
"upgrade_url": {
"type": [
"string",
"null"
]
}
},
"required": [
"email_verification",
"packages",
"upgrade_url"
]
},
"creator_notification": {
"type": "string",
"enum": [
"queued"
]
}
},
"required": [
"status",
"poll_url",
"preview_url",
"request_key",
"activation_requirements"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "noauth"
},
{
"type": "oauth2",
"scopes": [
"polls:create"
]
}
],
"_meta": {
"securitySchemes": [
{
"type": "noauth"
},
{
"type": "oauth2",
"scopes": [
"polls:create"
]
}
]
}
},
{
"name": "publish_poll",
"description": "Explicitly publish your own prepared poll after verified email and package checks. Keep missing prerequisites and content intact.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"key": {
"type": "string",
"minLength": 5,
"maxLength": 12,
"pattern": "^[A-Za-z0-9]+$"
}
},
"required": [
"key"
]
},
"outputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"key": {
"type": "string",
"pattern": "^[A-Za-z0-9]{5,12}$"
},
"poll_url": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"poc",
"live",
"closed"
]
},
"closed": {
"type": "boolean"
},
"title": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"type": {
"type": "integer"
},
"timezone": {
"type": "string"
},
"activation_requirements": {
"type": "object",
"additionalProperties": false,
"properties": {
"email_verification": {
"type": "boolean"
},
"packages": {
"type": "array",
"items": {
"type": "string",
"enum": [
"gold",
"platin"
]
}
},
"browser_publication": {
"type": "boolean"
},
"upgrade_url": {
"type": [
"string",
"null"
]
}
},
"required": [
"email_verification",
"packages",
"upgrade_url"
]
},
"creator_notification": {
"type": "string",
"enum": [
"queued"
]
}
},
"required": [
"key",
"poll_url",
"status"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "oauth2",
"scopes": [
"polls:publish"
]
}
],
"_meta": {
"securitySchemes": [
{
"type": "oauth2",
"scopes": [
"polls:publish"
]
}
]
}
},
{
"name": "list_polls",
"description": "List your own private previews and live polls, paginated. Requires your Fragab account connection.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"type": "integer",
"minimum": 0
}
},
"required": []
},
"outputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"data": {
"type": "array",
"maxItems": 100,
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"key": {
"type": "string",
"pattern": "^[A-Za-z0-9]{5,12}$"
},
"poll_url": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"poc",
"live",
"closed"
]
},
"closed": {
"type": "boolean"
},
"title": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"type": {
"type": "integer"
},
"timezone": {
"type": "string"
}
},
"required": [
"key",
"poll_url",
"status",
"closed",
"title",
"description",
"type",
"timezone"
]
}
},
"pagination": {
"type": "object",
"additionalProperties": false,
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"type": "integer",
"minimum": 0
},
"has_more": {
"type": "boolean"
}
},
"required": [
"limit",
"offset",
"has_more"
]
}
},
"required": [
"data",
"pagination"
]
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "oauth2",
"scopes": [
"polls:read"
]
}
],
"_meta": {
"securitySchemes": [
{
"type": "oauth2",
"scopes": [
"polls:read"
]
}
]
}
},
{
"name": "get_poll",
"description": "Read your own poll and its options and publication status. Never grants access to another creator’s poll.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"key": {
"type": "string",
"minLength": 5,
"maxLength": 12,
"pattern": "^[A-Za-z0-9]+$"
}
},
"required": [
"key"
]
},
"outputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"key": {
"type": "string",
"pattern": "^[A-Za-z0-9]{5,12}$"
},
"poll_url": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"poc",
"live",
"closed"
]
},
"closed": {
"type": "boolean"
},
"title": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"type": {
"type": "integer"
},
"timezone": {
"type": "string"
},
"options": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"text": {
"type": "string"
},
"date": {
"type": [
"string",
"null"
]
},
"time_start": {
"type": [
"string",
"null"
]
},
"time_end": {
"type": [
"string",
"null"
]
},
"storage_timezone": {
"type": "string"
},
"hidden": {
"type": "boolean"
},
"blocked": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"date",
"time_start",
"time_end",
"storage_timezone",
"hidden",
"blocked"
]
}
},
"activation_requirements": {
"type": "object",
"additionalProperties": false,
"properties": {
"email_verification": {
"type": "boolean"
},
"packages": {
"type": "array",
"items": {
"type": "string",
"enum": [
"gold",
"platin"
]
}
},
"browser_publication": {
"type": "boolean"
},
"upgrade_url": {
"type": [
"string",
"null"
]
}
},
"required": [
"email_verification",
"packages",
"upgrade_url"
]
}
},
"required": [
"key",
"poll_url",
"status",
"closed",
"title",
"description",
"type",
"timezone",
"options"
]
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "oauth2",
"scopes": [
"polls:read"
]
}
],
"_meta": {
"securitySchemes": [
{
"type": "oauth2",
"scopes": [
"polls:read"
]
}
]
}
},
{
"name": "get_poll_results",
"description": "Read aggregate results of your own live poll, with timestamp and an explainable recommendation retaining ties. Does not disclose participant identities or close the poll.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"key": {
"type": "string",
"minLength": 5,
"maxLength": 12,
"pattern": "^[A-Za-z0-9]+$"
}
},
"required": [
"key"
]
},
"outputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"poll_url": {
"type": "string"
},
"as_of": {
"type": "string"
},
"timezone": {
"type": "string"
},
"participants": {
"type": "integer",
"minimum": 0
},
"amounts_enabled": {
"type": "boolean"
},
"waiting_list_enabled": {
"type": "boolean"
},
"closed": {
"type": "boolean"
},
"options": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"text": {
"type": "string"
},
"date": {
"type": [
"string",
"null"
]
},
"time_start": {
"type": [
"string",
"null"
]
},
"time_end": {
"type": [
"string",
"null"
]
},
"storage_timezone": {
"type": "string"
},
"hidden": {
"type": "boolean"
},
"blocked": {
"type": "boolean"
},
"yes": {
"type": "integer",
"minimum": 0
},
"no": {
"type": "integer",
"minimum": 0
},
"maybe": {
"type": "integer",
"minimum": 0
}
},
"required": [
"id",
"text",
"date",
"time_start",
"time_end",
"storage_timezone",
"hidden",
"blocked",
"yes",
"no",
"maybe"
]
}
},
"recommendation": {
"type": "object",
"additionalProperties": false,
"properties": {
"option_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
}
},
"method": {
"type": "string",
"enum": [
"yes_desc_maybe_desc",
"not_applicable"
]
},
"applicable": {
"type": "boolean"
}
},
"required": [
"option_ids",
"method",
"applicable"
]
}
},
"required": [
"poll_url",
"as_of",
"timezone",
"participants",
"amounts_enabled",
"waiting_list_enabled",
"closed",
"options",
"recommendation"
]
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "oauth2",
"scopes": [
"polls:results:read"
]
}
],
"_meta": {
"securitySchemes": [
{
"type": "oauth2",
"scopes": [
"polls:results:read"
]
}
]
}
},
{
"name": "close_poll",
"description": "Close your own live poll only on explicit instruction. Optionally select an eligible winning option. Repeats do not close again or change an already closed winner.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"key": {
"type": "string",
"minLength": 5,
"maxLength": 12,
"pattern": "^[A-Za-z0-9]+$"
},
"winner_option_id": {
"type": "integer",
"minimum": 1
}
},
"required": [
"key"
]
},
"outputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"status": {
"type": "string",
"enum": [
"closed"
]
},
"poll_url": {
"type": "string"
},
"already_closed": {
"type": "boolean"
},
"realtime_update": {
"type": "string",
"enum": [
"requested",
"unavailable"
]
}
},
"required": [
"status",
"poll_url",
"already_closed"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "oauth2",
"scopes": [
"polls:close"
]
}
],
"_meta": {
"securitySchemes": [
{
"type": "oauth2",
"scopes": [
"polls:close"
]
}
]
}
}
]