{
  "generated_at": "2026-10-22T10:43:37.573Z",
  "source": [
    "contact-daniel and book-meeting-with-daniel SKILL.md (field tables parsed at build time)",
    "api/contact.mjs (spam rules and responses)"
  ],
  "about": "How an AI agent can contact Daniel Rosehill or request a meeting on a user's behalf, without an account: the form endpoint on www.danielrosehill.com, its fields, what it silently drops as spam, prefill links and the MCP server. Meetings are requests, never instant bookings.",
  "rules_for_agents": [
    "Both actions email a real person. Show your user the exact content, get an explicit yes, and send once.",
    "Use the user's real name and the email they want the reply at. Never invent details or submit something the user did not ask for.",
    "Meetings are requested, not booked: the user proposes times and Daniel replies by email with a calendar invitation. Never tell the user a meeting is confirmed.",
    "Daniel does not have time to answer personal requests for technical help; say so before sending one."
  ],
  "email": "public@danielrosehill.com",
  "contact": {
    "skill": "https://agents.danielrosehill.com/.well-known/agent-skills/contact-daniel/SKILL.md",
    "method": "POST",
    "endpoint": "https://www.danielrosehill.com/api/contact",
    "content_types": [
      "multipart/form-data",
      "application/x-www-form-urlencoded"
    ],
    "fields": [
      {
        "field": "name",
        "required": "yes",
        "notes": "The sender's real name."
      },
      {
        "field": "email",
        "required": "yes",
        "notes": "Where the reply and the acknowledgement go."
      },
      {
        "field": "contactType",
        "required": "no",
        "notes": "One of `Open Source`, `Business`, `Media`, `Just Saying Hi`."
      },
      {
        "field": "subject",
        "required": "no",
        "notes": "A short subject line."
      },
      {
        "field": "message",
        "required": "no, but send one",
        "notes": "Free text, up to 5,000 characters per field."
      },
      {
        "field": "_ts",
        "required": "yes",
        "notes": "Unix time in milliseconds when the user started the message. It must be at least 3 seconds and at most 24 hours before the POST."
      },
      {
        "field": "_gotcha",
        "required": "no",
        "notes": "Spam honeypot. Leave it out or empty. Any value drops the message."
      }
    ],
    "prefill_form": {
      "url": "https://www.danielrosehill.com/contact/form",
      "params": [
        "name",
        "email",
        "contactType",
        "subject",
        "message"
      ]
    }
  },
  "meeting_request": {
    "skill": "https://agents.danielrosehill.com/.well-known/agent-skills/book-meeting-with-daniel/SKILL.md",
    "method": "POST",
    "endpoint": "https://www.danielrosehill.com/api/contact",
    "content_types": [
      "multipart/form-data",
      "application/x-www-form-urlencoded"
    ],
    "instant_booking": false,
    "daniel_time_zone": "Asia/Jerusalem",
    "fields": [
      {
        "field": "formType",
        "required": "yes",
        "notes": "Exactly `Meeting request`. This is what makes it a meeting request rather than a plain message."
      },
      {
        "field": "name",
        "required": "yes",
        "notes": "The user's real name."
      },
      {
        "field": "email",
        "required": "yes",
        "notes": "Where Daniel's reply and the acknowledgement go."
      },
      {
        "field": "preferredTimes",
        "required": "yes",
        "notes": "Up to three proposed times, one per line, each with its date, time and the user's zone, e.g. `1. Wed 21 Oct 2026 15:00 Europe/London`. You can also give a window, or end with `Please suggest a time.` If the user has no preference, send just `Please suggest a time.` Converting each time to Jerusalem time as well, e.g. `(17:00 Jerusalem)`, helps Daniel."
      },
      {
        "field": "timezone",
        "required": "strongly recommended",
        "notes": "IANA name, e.g. `Europe/London`."
      },
      {
        "field": "topic",
        "required": "yes",
        "notes": "What the user wants to discuss and why. Use `topic`, not `message`."
      },
      {
        "field": "subject",
        "required": "recommended",
        "notes": "Purpose. One of `Consulting or project work`, `Collaboration`, `AI models, datasets or research`, `Media, podcast or speaking`, `Hiring`, `Just to connect`, `Other`."
      },
      {
        "field": "role",
        "required": "recommended",
        "notes": "The user's job title."
      },
      {
        "field": "website",
        "required": "no",
        "notes": "The user's website or LinkedIn URL. This is not the honeypot, which is `_gotcha`."
      },
      {
        "field": "source",
        "required": "no",
        "notes": "How the user found Daniel."
      },
      {
        "field": "submittedVia",
        "required": "yes, for agents",
        "notes": "Say that an agent sent it, e.g. `AI agent (ChatGPT) on behalf of the user`."
      },
      {
        "field": "meetingFormat",
        "required": "no",
        "notes": "`Video call` (default) or `Phone call`."
      },
      {
        "field": "duration",
        "required": "no",
        "notes": "`15 minutes`, `30 minutes` (default), `45 minutes` or `60 minutes`."
      },
      {
        "field": "phone",
        "required": "for phone calls",
        "notes": "Number with country code."
      },
      {
        "field": "companyName",
        "required": "no",
        "notes": "The user's organisation."
      },
      {
        "field": "_ts",
        "required": "yes",
        "notes": "Unix time in milliseconds when the user started the request. It must be at least 3 seconds and at most 24 hours before the POST."
      },
      {
        "field": "_gotcha",
        "required": "no",
        "notes": "Spam honeypot. Leave it out or empty. Any value drops the request."
      }
    ],
    "prefill_form": {
      "url": "https://www.danielrosehill.com/book-meeting",
      "params": [
        "name",
        "email",
        "companyName",
        "role",
        "website",
        "phone",
        "subject",
        "meetingFormat",
        "duration",
        "timezone",
        "topic",
        "source"
      ],
      "time_params": [
        {
          "param": "slot",
          "notes": "repeatable, up to 3. Local wall-clock time in the user's `timezone`, formatted exactly `YYYY-MM-DDTHH:MM`. The form converts each one to Jerusalem time for Daniel."
        },
        {
          "param": "preferredTimes",
          "notes": "free-text window."
        },
        {
          "param": "suggest=1",
          "notes": "ticks \"Please suggest a time\"."
        },
        {
          "param": "agent",
          "notes": "your name, e.g. `ChatGPT`. The request then records that an AI agent prepared it."
        }
      ]
    }
  },
  "responses": [
    {
      "status": 200,
      "body": "{\"ok\":true}",
      "meaning": "Accepted, and also what a spam drop returns. The sender gets an acknowledgement from forms@danielrosehill.com within minutes; if none arrives, fall back to email."
    },
    {
      "status": 400,
      "body": "{\"error\":\"...\"}",
      "meaning": "Missing or invalid field (name and email are required; each field at most 5,000 characters). Fix and resend."
    },
    {
      "status": 500,
      "body": "{\"error\":\"...\"}",
      "meaning": "Delivery failed (5xx). Email public@danielrosehill.com instead."
    }
  ],
  "silently_dropped_as_spam": [
    "_ts missing, less than 3 seconds or more than 24 hours before the POST (Unix milliseconds)",
    "any value in the _gotcha honeypot",
    "a name that is one run of 12 or more letters with 3 or more capitals after the first (a random token)",
    "a message with no spaces longer than 10 characters, or a random-token message",
    "a Gmail address with 3 or more dots before the @"
  ],
  "business": {
    "name": "DSR Holdings",
    "url": "https://dsrholdings.cloud",
    "meeting": "https://www.dsrholdings.cloud/contact/meeting",
    "note": "For consulting or project work the user may prefer DSR Holdings directly."
  },
  "mcp_server": {
    "url": "https://mcp.danielrosehill.com/mcp",
    "transport": "streamable HTTP",
    "auth": "none",
    "tools": [
      "about_daniel",
      "ask_about_daniel",
      "get_resume",
      "download_cv",
      "search_projects",
      "get_blog_posts",
      "get_recommendations",
      "send_message",
      "request_meeting"
    ],
    "note": "send_message and request_meeting post to the same endpoint as above. The bare host https://mcp.danielrosehill.com/ answers 404; use /mcp."
  },
  "other_channels": {
    "linkedin": "https://www.linkedin.com/in/danielrosehill",
    "github": "https://github.com/danielrosehill",
    "vcard": "https://www.danielrosehill.com/daniel-rosehill.vcf",
    "email_and_pgp": "https://www.danielrosehill.com/contact/email",
    "contact_page": "https://www.danielrosehill.com/contact"
  }
}
