← WebMCP Directory

Tool tree

michaelchurley.com

Productivity & BusinessTools verified
Website
Michael C. Hurley: 20 years of SEO, now focused on AEO and GEO. Director at Hustle Launch; builds production Next.js, Convex, and Stripe sites plus AI agent tooling in Canton, NC.
Explore capabilities

    page: Every page

    get_resumeAnswer

    Michael C. Hurley's resume in JSON Resume format (same as /resume.json).

    View tool JSON
    {
      "name": "get_resume",
      "kind": "answer",
      "impl": "imperative",
      "description": "Michael C. Hurley's resume in JSON Resume format (same as /resume.json).",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "/"
    }
    list_portfolioAnswer

    Portfolio pieces (sites, interfaces, marks) with media and live links.

    View tool JSON
    {
      "name": "list_portfolio",
      "kind": "answer",
      "impl": "imperative",
      "description": "Portfolio pieces (sites, interfaces, marks) with media and live links.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "category": {
            "type": "string",
            "enum": [
              "sites",
              "interfaces",
              "marks"
            ]
          }
        }
      },
      "page": "/"
    }
    list_blog_postsAnswer

    Published blog posts, newest first, with URLs and Markdown links.

    View tool JSON
    {
      "name": "list_blog_posts",
      "kind": "answer",
      "impl": "imperative",
      "description": "Published blog posts, newest first, with URLs and Markdown links.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tag": {
            "type": "string",
            "description": "Only posts with this tag"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "description": "Maximum posts to return"
          }
        }
      },
      "page": "/"
    }
    get_blog_postAnswer

    Full Markdown of one blog post by slug (see list_blog_posts).

    View tool JSON
    {
      "name": "get_blog_post",
      "kind": "answer",
      "impl": "imperative",
      "description": "Full Markdown of one blog post by slug (see list_blog_posts).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          }
        },
        "required": [
          "slug"
        ]
      },
      "page": "/"
    }
    get_page_markdownAnswer

    Markdown for any page on this site, e.g. "/", "/portfolio", "/blog/<slug>", "/aeo".

    View tool JSON
    {
      "name": "get_page_markdown",
      "kind": "answer",
      "impl": "imperative",
      "description": "Markdown for any page on this site, e.g. \"/\", \"/portfolio\", \"/blog/<slug>\", \"/aeo\".",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ]
      },
      "page": "/"
    }
    search_siteAnswer

    Keyword search across the resume, portfolio, and blog posts.

    View tool JSON
    {
      "name": "search_site",
      "kind": "answer",
      "impl": "imperative",
      "description": "Keyword search across the resume, portfolio, and blog posts.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          }
        },
        "required": [
          "query"
        ]
      },
      "page": "/"
    }
    get_booking_optionsAnswer

    How to schedule a call with Michael: meeting types, duration, time zone, hours, and required fields. Step 1 of get_booking_options -> get_availability -> book_meeting.

    View tool JSON
    {
      "name": "get_booking_options",
      "kind": "answer",
      "impl": "imperative",
      "description": "How to schedule a call with Michael: meeting types, duration, time zone, hours, and required fields. Step 1 of get_booking_options -> get_availability -> book_meeting.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "/"
    }
    get_availabilityAnswer

    Open 30-minute slots between two dates (inclusive, up to 62 days). Pass a slot_start from the result to book_meeting.

    View tool JSON
    {
      "name": "get_availability",
      "kind": "answer",
      "impl": "imperative",
      "description": "Open 30-minute slots between two dates (inclusive, up to 62 days). Pass a slot_start from the result to book_meeting.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "date_from": {
            "type": "string",
            "description": "YYYY-MM-DD (default: today, Eastern)"
          },
          "date_to": {
            "type": "string",
            "description": "YYYY-MM-DD (default: date_from + 7 days)"
          },
          "timezone": {
            "type": "string",
            "description": "IANA zone for the 'local' labels, e.g. America/Chicago"
          },
          "meeting_type": {
            "type": "string",
            "enum": [
              "intro-call"
            ]
          }
        }
      },
      "page": "/"
    }
    book_meetingSensitive Action

    Books a 30-minute call with Michael for an open slot from get_availability. Same path as the /book form: saves the booking and emails the visitor a confirmation with a calendar invite. Set dry_run to validate without booking.

    View tool JSON
    {
      "name": "book_meeting",
      "kind": "transact",
      "impl": "imperative",
      "description": "Books a 30-minute call with Michael for an open slot from get_availability. Same path as the /book form: saves the booking and emails the visitor a confirmation with a calendar invite. Set dry_run to validate without booking.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slot_start": {
            "type": "string",
            "description": "ISO 8601 start time from get_availability"
          },
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "phone": {
            "type": "string"
          },
          "notes": {
            "type": "string"
          },
          "timezone": {
            "type": "string",
            "description": "Visitor's IANA zone, used for the 'local' label"
          },
          "meeting_type": {
            "type": "string",
            "enum": [
              "intro-call"
            ]
          },
          "dry_run": {
            "type": "boolean",
            "description": "Validate only; nothing is booked or emailed"
          }
        },
        "required": [
          "slot_start",
          "name",
          "email"
        ]
      },
      "page": "/"
    }