Doorman MCP
Doorman reads every submission to a website's forms and lets real customers through while sales pitches, SEO spam and bots stay out. It stops spam, forwards only real submissions, and provides a plain-language reason for each decision, allowing agents to integrate spam screening directly into form handling workflows.
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.
https://withdoorman.com/mcpWhat its tools do
12 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (5)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to withdoorman.com ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Screen contact form submissions for spam
- Filter SEO spam and bots from lead forms
- Automate fraud screening for demo requests
Source and maintenance
Protocol and capabilities
- Server
- doorman 0.1.0
- MCP protocol negotiated in check
- 2025-06-18
- Tools
- 12 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
12 advertised
doorman_docs
Read how Doorman works and how to integrate it (the same text as /llms.txt). Call this first if you haven't used Doorman before.
{
"type": "object",
"properties": {}
}{
"readOnlyHint": true
}doorman_signup
Create a Doorman account for the user with a first form and an API key. Ask the user for their email first. They'll get an email to set a dashboard password. Creates the account's first form too and returns its id and action URL, plus the api_key (store it as DOORMAN_KEY in the project's local secrets file, never commit it). Only for new users: if they already have an account, ask for a key instead. Until the user clicks the confirmation link in that email, nothing is emailed to them (100 checks; Slack and webhooks work).
{
"type": "object",
"required": [
"email",
"site_url",
"site_context"
],
"properties": {
"mode": {
"enum": [
"watch",
"enforce"
],
"type": "string",
"description": "watch delivers would-be drops, tagged; holds still follow forward_holds. Recommended for a new lead form: switch to enforce after a week or two of verdicts look right. Default enforce."
},
"email": {
"type": "string",
"description": "The user's email. Real submissions are forwarded here by default."
},
"site_url": {
"type": "string",
"description": "The website the form is on, e.g. acme.com"
},
"form_name": {
"type": "string",
"description": "Optional name, e.g. 'Contact form' or 'Demo request'"
},
"site_context": {
"type": "string",
"description": "One or two sentences: what the business sells and to whom. Doorman compares every submission against this. Read the project's README/landing copy to write it."
}
}
}doorman_whoami
Account, plan and this month's usage.
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "Doorman API key (dm_live_...). Only needed if the MCP connection has no Authorization header."
}
}
}{
"readOnlyHint": true
}doorman_list_forms
List the account's forms with their action URLs and settings.
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "Doorman API key (dm_live_...). Only needed if the MCP connection has no Authorization header."
}
}
}{
"readOnlyHint": true
}doorman_create_form
Create another form endpoint (one per distinct form on the site: contact, demo request, checkout, comments).
{
"type": "object",
"required": [
"name"
],
"properties": {
"kind": {
"enum": [
"lead",
"signup",
"checkout",
"comment"
],
"type": "string",
"description": "lead = contact/demo/quote/sales form (default)"
},
"name": {
"type": "string",
"description": "Form name"
},
"api_key": {
"type": "string",
"description": "Doorman API key (dm_live_...). Only needed if the MCP connection has no Authorization header."
},
"email_to": {
"type": "string",
"description": "Comma-separated emails to forward real submissions to"
},
"slack_url": {
"type": "string",
"description": "Slack incoming webhook URL"
},
"webhook_url": {
"type": "string",
"description": "HTTPS URL that receives a signed JSON POST per real submission"
},
"redirect_url": {
"type": "string",
"description": "Where to send the visitor after submitting (default: a Doorman thank-you page)"
},
"site_context": {
"type": "string",
"description": "What the business sells and to whom"
}
}
}doorman_update_form
Change a form's settings: context, destinations, thresholds, watch mode, allow/block lists.
{
"type": "object",
"required": [
"form_id"
],
"properties": {
"kind": {
"enum": [
"lead",
"signup",
"checkout",
"comment"
],
"type": "string"
},
"mode": {
"enum": [
"enforce",
"watch"
],
"type": "string",
"description": "watch = deliver would-be drops, tagged (a safe way to start)"
},
"name": {
"type": "string",
"description": "Form name"
},
"api_key": {
"type": "string",
"description": "Doorman API key (dm_live_...). Only needed if the MCP connection has no Authorization header."
},
"form_id": {
"type": "string",
"description": "f_..."
},
"email_to": {
"type": "string",
"description": "Comma-separated emails"
},
"slack_url": {
"type": "string",
"description": "Slack incoming webhook URL"
},
"allow_list": {
"type": "array",
"items": {
"type": "string"
},
"description": "Emails or domains always delivered without judging"
},
"block_list": {
"type": "array",
"items": {
"type": "string"
},
"description": "Emails or domains always dropped"
},
"deliver_at": {
"type": "number",
"description": "Deliver when P(real) >= this (default 0.8)"
},
"drop_below": {
"type": "number",
"description": "Drop when P(real) < this (default 0.2)"
},
"webhook_url": {
"type": "string",
"description": "HTTPS webhook URL"
},
"redirect_url": {
"type": "string",
"description": "Redirect after submit"
},
"site_context": {
"type": "string",
"description": "What the business sells and to whom"
},
"forward_holds": {
"type": "boolean",
"description": "Forward held submissions, flagged (default true)"
}
}
}doorman_get_install_snippet
Get ready-to-paste integration code for a form on a given platform. Use 'html' for static sites, 'react' for SPA client components, and 'fetch' (plain fetch with timeout and fallback: Workers, Node, Next, Deno), 'nextjs', 'express', 'python', 'ruby' or 'elixir' when the form already posts to the project's own backend.
{
"type": "object",
"required": [
"form_id",
"platform"
],
"properties": {
"api_key": {
"type": "string",
"description": "Doorman API key (dm_live_...). Only needed if the MCP connection has no Authorization header."
},
"form_id": {
"type": "string",
"description": "f_..."
},
"platform": {
"enum": [
"html",
"ajax",
"react",
"fetch",
"nextjs",
"express",
"curl",
"python",
"ruby",
"elixir",
"webflow",
"framer",
"wordpress"
],
"type": "string"
}
}
}{
"readOnlyHint": true
}doorman_test_submission
Judge a sample message against a form's settings. Free, not forwarded, not counted. Use it to show the user Doorman working after setup (try one genuine enquiry and one sales pitch).
{
"type": "object",
"required": [
"form_id",
"message"
],
"properties": {
"email": {
"type": "string",
"description": "Optional sender email"
},
"api_key": {
"type": "string",
"description": "Doorman API key (dm_live_...). Only needed if the MCP connection has no Authorization header."
},
"form_id": {
"type": "string",
"description": "f_..."
},
"message": {
"type": "string",
"description": "The message text"
}
}
}doorman_send_test_delivery
Send a sample delivery to the form's email/Slack/webhook destinations and report whether each one worked.
{
"type": "object",
"required": [
"form_id"
],
"properties": {
"api_key": {
"type": "string",
"description": "Doorman API key (dm_live_...). Only needed if the MCP connection has no Authorization header."
},
"form_id": {
"type": "string",
"description": "f_..."
}
}
}doorman_list_submissions
Recent submissions with their verdicts. Use review=true for held ones waiting for a human.
{
"type": "object",
"properties": {
"limit": {
"type": "number"
},
"route": {
"enum": [
"deliver",
"hold",
"drop"
],
"type": "string"
},
"review": {
"type": "boolean"
},
"api_key": {
"type": "string",
"description": "Doorman API key (dm_live_...). Only needed if the MCP connection has no Authorization header."
},
"form_id": {
"type": "string",
"description": "Optional f_..."
}
}
}{
"readOnlyHint": true
}doorman_label_submission
Mark a submission real (delivers it if it was held or dropped) or spam.
{
"type": "object",
"required": [
"submission_id",
"label"
],
"properties": {
"label": {
"enum": [
"real",
"spam"
],
"type": "string"
},
"api_key": {
"type": "string",
"description": "Doorman API key (dm_live_...). Only needed if the MCP connection has no Authorization header."
},
"submission_id": {
"type": "string",
"description": "sub_..."
}
}
}doorman_contact_support
Stuck, or something isn't working? Send the problem straight to Doorman's founder, with the error you hit. Your account context (plan, forms, recent errors, never keys) is attached, and the reply goes to the account email. Use it instead of guessing at a fix.
{
"type": "object",
"required": [
"message"
],
"properties": {
"error": {
"type": "string",
"description": "The exact error text, if any"
},
"api_key": {
"type": "string",
"description": "Doorman API key (dm_live_...). Only needed if the MCP connection has no Authorization header."
},
"message": {
"type": "string",
"description": "What you were trying to do and what happened"
},
"category": {
"enum": [
"setup",
"bug",
"billing",
"question",
"other"
],
"type": "string"
}
}
}Prompts
Not advertised
Resources
Not advertised
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.
- 2026-11-07: 1 of 1 checks answered
- 2026-11-09: 2 of 2 checks answered
- 2026-11-10: 2 of 2 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
- 351 ms
- 95th percentile latency
- 351 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 351 ms · metadata changed · 12 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http doorman-mcp-withdoorman https://withdoorman.com/mcpCodex
codex mcp add doorman-mcp-withdoorman --url https://withdoorman.com/mcpCursor
{
"mcpServers": {
"doorman-mcp-withdoorman": {
"url": "https://withdoorman.com/mcp"
}
}
}Cline
{
"mcpServers": {
"doorman-mcp-withdoorman": {
"type": "streamableHttp",
"url": "https://withdoorman.com/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"doorman-mcp-withdoorman": {
"type": "http",
"url": "https://withdoorman.com/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http doorman-mcp-withdoorman https://withdoorman.com/mcpClaude Desktop
https://withdoorman.com/mcpWindsurf
{
"mcpServers": {
"doorman-mcp-withdoorman": {
"serverUrl": "https://withdoorman.com/mcp"
}
}
}Let your agent find its tools
Find servers like Doorman MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run Doorman MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.