Koskamo

Online Poll Maker MCP

An MCP server that allows AI agents to prepare poll drafts via HTTP API. It provides tools to create, retrieve, and update poll drafts, which are then reviewed and published by a human in the browser. Agents cannot publish, vote, or manage polls directly.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Online Poll Maker MCP logo, by Online Poll MakerCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-08Published by Online Poll Maker
MCP endpoint (Streamable HTTP)
https://onlinepollmaker.com/mcp
Vendor documentation

What its tools do

3 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

Read-only (1)

3 of 3 have a description · 3 of 3 declare behavior hints · 3 of 3 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Create a poll draft with single-choice questions
  • Retrieve the status of an existing poll draft
  • Update the content of a poll draft before human review

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
online-poll-maker 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
3 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "logging": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Online Poll Maker (onlinepollmaker.com) is a free poll maker that needs no account. You prepare a poll draft; the person reviews and publishes it in their browser. You never publish. Ask only what you need (questions, 2-10 options each, optional title, whether to collect email and why), then call create_poll_draft and give the person the edit_url, saying the draft is ready to review and publish. To change a draft later, call get_poll_draft first (they may have edited it in the browser), then update_poll_draft with the complete content and the version you read. Keep the token private and share the edit_url only with the person. Full rules: https://onlinepollmaker.com/agents.md

Tools

3 advertised

create_poll_draft — Create poll draft
Advertised by the server during the last successful anonymous check.

Create a poll draft (1-100 single-choice questions, 2-10 options each). Returns id, token, version and edit_url. Give the edit_url to the person so they can review, verify and publish it in their browser; the draft expires 24 hours after creation. Never say the poll is published.

create_poll_draft input schema
{
  "type": "object",
  "required": [
    "questions"
  ],
  "properties": {
    "title": {
      "type": "string",
      "description": "Optional poll title, up to 200 characters after trimming. Empty means the first question is used as the title."
    },
    "questions": {
      "type": [
        "null",
        "array"
      ],
      "items": {
        "type": "object",
        "required": [
          "text",
          "options"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "Question text, 1-200 characters after trimming. Plain text."
          },
          "options": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "object",
              "required": [
                "text"
              ],
              "properties": {
                "text": {
                  "type": "string",
                  "description": "Option text, 1-100 characters after trimming. Plain text."
                },
                "image_url": {
                  "type": "string",
                  "description": "Optional direct HTTPS image URL (up to 2048 characters)."
                }
              },
              "additionalProperties": false
            },
            "description": "2-10 options; duplicates within a question are rejected"
          },
          "image_url": {
            "type": "string",
            "description": "Optional direct HTTPS image URL (up to 2048 characters). The image is loaded by participants' browsers, not by the server."
          }
        },
        "additionalProperties": false
      },
      "description": "1-100 required single-choice questions"
    },
    "email_mode": {
      "type": "string",
      "description": "One of none (default), optional or required: whether participants are asked for an email address shared with the creator. Cannot change after publishing."
    },
    "email_purpose": {
      "type": "string",
      "description": "Required when email_mode is optional or required: a short note (up to 200 characters) telling participants why the email is collected."
    }
  },
  "additionalProperties": false
}
create_poll_draft output schema
{
  "type": "object",
  "required": [
    "id",
    "version",
    "expires_at"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "token": {
      "type": "string"
    },
    "content": {
      "type": [
        "null",
        "object"
      ],
      "required": [
        "questions"
      ],
      "properties": {
        "title": {
          "type": "string",
          "description": "Optional poll title, up to 200 characters after trimming. Empty means the first question is used as the title."
        },
        "questions": {
          "type": [
            "null",
            "array"
          ],
          "items": {
            "type": "object",
            "required": [
              "text",
              "options"
            ],
            "properties": {
              "text": {
                "type": "string",
                "description": "Question text, 1-200 characters after trimming. Plain text."
              },
              "options": {
                "type": [
                  "null",
                  "array"
                ],
                "items": {
                  "type": "object",
                  "required": [
                    "text"
                  ],
                  "properties": {
                    "text": {
                      "type": "string",
                      "description": "Option text, 1-100 characters after trimming. Plain text."
                    },
                    "image_url": {
                      "type": "string",
                      "description": "Optional direct HTTPS image URL (up to 2048 characters)."
                    }
                  },
                  "additionalProperties": false
                },
                "description": "2-10 options; duplicates within a question are rejected"
              },
              "image_url": {
                "type": "string",
                "description": "Optional direct HTTPS image URL (up to 2048 characters). The image is loaded by participants' browsers, not by the server."
              }
            },
            "additionalProperties": false
          },
          "description": "1-100 required single-choice questions"
        },
        "email_mode": {
          "type": "string",
          "description": "One of none (default), optional or required: whether participants are asked for an email address shared with the creator. Cannot change after publishing."
        },
        "email_purpose": {
          "type": "string",
          "description": "Required when email_mode is optional or required: a short note (up to 200 characters) telling participants why the email is collected."
        }
      },
      "additionalProperties": false
    },
    "version": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": -2147483648
    },
    "edit_url": {
      "type": "string"
    },
    "expires_at": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
create_poll_draft annotations
{
  "readOnlyHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_poll_draft — Read poll draft
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read the latest content and version of a draft. Call this before every update: the person may have edited the draft in the browser.

get_poll_draft input schema
{
  "type": "object",
  "required": [
    "id",
    "token"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "draft id returned by create_poll_draft"
    },
    "token": {
      "type": "string",
      "description": "draft token returned by create_poll_draft"
    }
  },
  "additionalProperties": false
}
get_poll_draft output schema
{
  "type": "object",
  "required": [
    "id",
    "version",
    "expires_at"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "token": {
      "type": "string"
    },
    "content": {
      "type": [
        "null",
        "object"
      ],
      "required": [
        "questions"
      ],
      "properties": {
        "title": {
          "type": "string",
          "description": "Optional poll title, up to 200 characters after trimming. Empty means the first question is used as the title."
        },
        "questions": {
          "type": [
            "null",
            "array"
          ],
          "items": {
            "type": "object",
            "required": [
              "text",
              "options"
            ],
            "properties": {
              "text": {
                "type": "string",
                "description": "Question text, 1-200 characters after trimming. Plain text."
              },
              "options": {
                "type": [
                  "null",
                  "array"
                ],
                "items": {
                  "type": "object",
                  "required": [
                    "text"
                  ],
                  "properties": {
                    "text": {
                      "type": "string",
                      "description": "Option text, 1-100 characters after trimming. Plain text."
                    },
                    "image_url": {
                      "type": "string",
                      "description": "Optional direct HTTPS image URL (up to 2048 characters)."
                    }
                  },
                  "additionalProperties": false
                },
                "description": "2-10 options; duplicates within a question are rejected"
              },
              "image_url": {
                "type": "string",
                "description": "Optional direct HTTPS image URL (up to 2048 characters). The image is loaded by participants' browsers, not by the server."
              }
            },
            "additionalProperties": false
          },
          "description": "1-100 required single-choice questions"
        },
        "email_mode": {
          "type": "string",
          "description": "One of none (default), optional or required: whether participants are asked for an email address shared with the creator. Cannot change after publishing."
        },
        "email_purpose": {
          "type": "string",
          "description": "Required when email_mode is optional or required: a short note (up to 200 characters) telling participants why the email is collected."
        }
      },
      "additionalProperties": false
    },
    "version": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": -2147483648
    },
    "edit_url": {
      "type": "string"
    },
    "expires_at": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_poll_draft annotations
{
  "readOnlyHint": true,
  "idempotentHint": false
}
update_poll_draft — Replace poll draft
Advertised by the server during the last successful anonymous check.

Replace the whole draft content. Send the version you just read with get_poll_draft. On version_conflict, read the draft again and re-apply your change; never overwrite newer content with an older copy.

update_poll_draft input schema
{
  "type": "object",
  "required": [
    "id",
    "token",
    "version",
    "content"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "draft id returned by create_poll_draft"
    },
    "token": {
      "type": "string",
      "description": "draft token returned by create_poll_draft"
    },
    "content": {
      "type": "object",
      "required": [
        "questions"
      ],
      "properties": {
        "title": {
          "type": "string",
          "description": "Optional poll title, up to 200 characters after trimming. Empty means the first question is used as the title."
        },
        "questions": {
          "type": [
            "null",
            "array"
          ],
          "items": {
            "type": "object",
            "required": [
              "text",
              "options"
            ],
            "properties": {
              "text": {
                "type": "string",
                "description": "Question text, 1-200 characters after trimming. Plain text."
              },
              "options": {
                "type": [
                  "null",
                  "array"
                ],
                "items": {
                  "type": "object",
                  "required": [
                    "text"
                  ],
                  "properties": {
                    "text": {
                      "type": "string",
                      "description": "Option text, 1-100 characters after trimming. Plain text."
                    },
                    "image_url": {
                      "type": "string",
                      "description": "Optional direct HTTPS image URL (up to 2048 characters)."
                    }
                  },
                  "additionalProperties": false
                },
                "description": "2-10 options; duplicates within a question are rejected"
              },
              "image_url": {
                "type": "string",
                "description": "Optional direct HTTPS image URL (up to 2048 characters). The image is loaded by participants' browsers, not by the server."
              }
            },
            "additionalProperties": false
          },
          "description": "1-100 required single-choice questions"
        },
        "email_mode": {
          "type": "string",
          "description": "One of none (default), optional or required: whether participants are asked for an email address shared with the creator. Cannot change after publishing."
        },
        "email_purpose": {
          "type": "string",
          "description": "Required when email_mode is optional or required: a short note (up to 200 characters) telling participants why the email is collected."
        }
      },
      "description": "the complete poll content; it replaces the whole draft",
      "additionalProperties": false
    },
    "version": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": -2147483648,
      "description": "the version you just read with get_poll_draft; a newer version on the server returns version_conflict"
    }
  },
  "additionalProperties": false
}
update_poll_draft output schema
{
  "type": "object",
  "required": [
    "id",
    "version",
    "expires_at"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "token": {
      "type": "string"
    },
    "content": {
      "type": [
        "null",
        "object"
      ],
      "required": [
        "questions"
      ],
      "properties": {
        "title": {
          "type": "string",
          "description": "Optional poll title, up to 200 characters after trimming. Empty means the first question is used as the title."
        },
        "questions": {
          "type": [
            "null",
            "array"
          ],
          "items": {
            "type": "object",
            "required": [
              "text",
              "options"
            ],
            "properties": {
              "text": {
                "type": "string",
                "description": "Question text, 1-200 characters after trimming. Plain text."
              },
              "options": {
                "type": [
                  "null",
                  "array"
                ],
                "items": {
                  "type": "object",
                  "required": [
                    "text"
                  ],
                  "properties": {
                    "text": {
                      "type": "string",
                      "description": "Option text, 1-100 characters after trimming. Plain text."
                    },
                    "image_url": {
                      "type": "string",
                      "description": "Optional direct HTTPS image URL (up to 2048 characters)."
                    }
                  },
                  "additionalProperties": false
                },
                "description": "2-10 options; duplicates within a question are rejected"
              },
              "image_url": {
                "type": "string",
                "description": "Optional direct HTTPS image URL (up to 2048 characters). The image is loaded by participants' browsers, not by the server."
              }
            },
            "additionalProperties": false
          },
          "description": "1-100 required single-choice questions"
        },
        "email_mode": {
          "type": "string",
          "description": "One of none (default), optional or required: whether participants are asked for an email address shared with the creator. Cannot change after publishing."
        },
        "email_purpose": {
          "type": "string",
          "description": "Required when email_mode is optional or required: a short note (up to 200 characters) telling participants why the email is collected."
        }
      },
      "additionalProperties": false
    },
    "version": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": -2147483648
    },
    "edit_url": {
      "type": "string"
    },
    "expires_at": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
update_poll_draft annotations
{
  "readOnlyHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-09: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
670 ms
95th percentile latency
670 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 670 ms · metadata changed · 3 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http online-poll-maker-mcp https://onlinepollmaker.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add online-poll-maker-mcp --url https://onlinepollmaker.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable online-poll-maker-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "online-poll-maker-mcp": {
      "url": "https://onlinepollmaker.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "online-poll-maker-mcp": {
      "type": "streamableHttp",
      "url": "https://onlinepollmaker.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start online-poll-maker-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "online-poll-maker-mcp": {
      "type": "http",
      "url": "https://onlinepollmaker.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http online-poll-maker-mcp https://onlinepollmaker.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://onlinepollmaker.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "online-poll-maker-mcp": {
      "serverUrl": "https://onlinepollmaker.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Online Poll Maker MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.