← WebMCP Directory

Tool tree

patrickjv.com

Media & PersonalTools verified
Website
I build the platforms, infrastructure and identity systems that let a small team ship like a large one, and I hold the AI agents writing that team's code to the same standard as people.
Explore capabilities
    get_profileAnswer

    Patrick Vieira's public profile (platform engineer, London — not the footballer): name, headline, tagline, location and links.

    View tool JSON
    {
      "name": "get_profile",
      "kind": "answer",
      "impl": "imperative",
      "description": "Patrick Vieira's public profile (platform engineer, London — not the footballer): name, headline, tagline, location and links.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/"
    }
    list_workAnswer

    Selected work: title, summary and tags for each item.

    View tool JSON
    {
      "name": "list_work",
      "kind": "answer",
      "impl": "imperative",
      "description": "Selected work: title, summary and tags for each item.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/"
    }
    list_skillsAnswer

    Patrick Vieira's listed skills.

    View tool JSON
    {
      "name": "list_skills",
      "kind": "answer",
      "impl": "imperative",
      "description": "Patrick Vieira's listed skills.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/"
    }
    list_faqAnswer

    Quick answers about Patrick Vieira: each question (q) with its answer (a).

    View tool JSON
    {
      "name": "list_faq",
      "kind": "answer",
      "impl": "imperative",
      "description": "Quick answers about Patrick Vieira: each question (q) with its answer (a).",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/"
    }
    request_introSensitive Action

    Send Patrick Vieira a short introduction by email on behalf of a person. Only use this when the person has asked you to contact him and has approved the message. Strictly rate-limited; at most a couple per sender per day. Do not retry on error. Privacy: the message is forwarded to Patrick's email and not stored by this site; rate-limit counters are hashed and expire daily. In this browser, the person is also asked to confirm the exact message before anything is sent.

    View tool JSON
    {
      "name": "request_intro",
      "kind": "transact",
      "impl": "imperative",
      "description": "Send Patrick Vieira a short introduction by email on behalf of a person. Only use this when the person has asked you to contact him and has approved the message. Strictly rate-limited; at most a couple per sender per day. Do not retry on error. Privacy: the message is forwarded to Patrick's email and not stored by this site; rate-limit counters are hashed and expire daily. In this browser, the person is also asked to confirm the exact message before anything is sent.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "from_name",
          "from_email",
          "reason",
          "message"
        ],
        "properties": {
          "from_name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "Full name of the person making the introduction."
          },
          "from_email": {
            "type": "string",
            "maxLength": 254,
            "description": "Email address Patrick should reply to (ASCII)."
          },
          "organisation": {
            "type": "string",
            "maxLength": 100,
            "description": "Optional organisation."
          },
          "reason": {
            "type": "string",
            "enum": [
              "recruiting",
              "collaboration",
              "speaking",
              "other"
            ]
          },
          "message": {
            "type": "string",
            "minLength": 20,
            "maxLength": 2000,
            "description": "The introduction itself, in plain text."
          },
          "agent": {
            "type": "string",
            "maxLength": 100,
            "description": "Optional: name of the AI agent sending this on the person's behalf."
          }
        }
      },
      "page": "/"
    }
    get_booking_guideAnswer

    The booking guide: how to book a call with Patrick Vieira, step by step, and how to cancel one. Read this first; no sign-in needed.

    View tool JSON
    {
      "name": "get_booking_guide",
      "kind": "answer",
      "impl": "imperative",
      "description": "The booking guide: how to book a call with Patrick Vieira, step by step, and how to cancel one. Read this first; no sign-in needed.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/"
    }
    list_meeting_typesAnswer

    Step 1 of the booking guide (get_booking_guide). The kinds of meeting you can book with Patrick Vieira: id, title, length in minutes and what each is for.

    View tool JSON
    {
      "name": "list_meeting_types",
      "kind": "answer",
      "impl": "imperative",
      "description": "Step 1 of the booking guide (get_booking_guide). The kinds of meeting you can book with Patrick Vieira: id, title, length in minutes and what each is for.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/"
    }
    get_availabilityAnswer

    Step 2 of the booking guide (get_booking_guide). Free start times for a meeting type, from Patrick's live calendar: weekdays 10:00–17:00 London time, at least 24 hours ahead and up to four weeks out. Times are ISO 8601 with the Europe/London offset. Optional from and to (YYYY-MM-DD, London days) narrow the range.

    View tool JSON
    {
      "name": "get_availability",
      "kind": "answer",
      "impl": "imperative",
      "description": "Step 2 of the booking guide (get_booking_guide). Free start times for a meeting type, from Patrick's live calendar: weekdays 10:00–17:00 London time, at least 24 hours ahead and up to four weeks out. Times are ISO 8601 with the Europe/London offset. Optional from and to (YYYY-MM-DD, London days) narrow the range.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "consultation",
              "recruiter-intro"
            ],
            "description": "A meeting type id from list_meeting_types."
          },
          "from": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "description": "Optional first day, YYYY-MM-DD."
          },
          "to": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "description": "Optional last day, YYYY-MM-DD."
          }
        }
      },
      "page": "/"
    }
    book_meetingSensitive Action

    Step 4 of the booking guide (get_booking_guide). Ask to book a time with Patrick Vieira for a person: returns a confirm_url to give them. Nothing is reserved yet, and nothing is emailed: the call is booked, in their name, when they open the link and sign in with Google (within 60 minutes). Don't send their name or email address: those come from their sign-in. Only use this when the person has asked for this meeting at this time. Do not retry on error. Then use get_booking_status. Privacy: until the person signs in, the site keeps only the type, time and note; see https://patrickjv.com/privacy.

    View tool JSON
    {
      "name": "book_meeting",
      "kind": "transact",
      "impl": "imperative",
      "description": "Step 4 of the booking guide (get_booking_guide). Ask to book a time with Patrick Vieira for a person: returns a confirm_url to give them. Nothing is reserved yet, and nothing is emailed: the call is booked, in their name, when they open the link and sign in with Google (within 60 minutes). Don't send their name or email address: those come from their sign-in. Only use this when the person has asked for this meeting at this time. Do not retry on error. Then use get_booking_status. Privacy: until the person signs in, the site keeps only the type, time and note; see https://patrickjv.com/privacy.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type",
          "start"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "consultation",
              "recruiter-intro"
            ],
            "description": "A meeting type id from list_meeting_types."
          },
          "start": {
            "type": "string",
            "maxLength": 40,
            "description": "Start time exactly as given by get_availability (ISO 8601 with offset)."
          },
          "note": {
            "type": "string",
            "maxLength": 500,
            "description": "Optional: what the meeting is about, in plain text."
          }
        }
      },
      "page": "/"
    }
    get_booking_statusAnswer

    Step 6 of the booking guide (get_booking_guide). The state of a booking by its ID: pending_confirmation, confirmed, declined, expired or cancelled, with a reason where there is one, the time, the meeting type and a next_step saying what to do. Never returns the guest's details.

    View tool JSON
    {
      "name": "get_booking_status",
      "kind": "answer",
      "impl": "imperative",
      "description": "Step 6 of the booking guide (get_booking_guide). The state of a booking by its ID: pending_confirmation, confirmed, declined, expired or cancelled, with a reason where there is one, the time, the meeting type and a next_step saying what to do. Never returns the guest's details.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "booking_id"
        ],
        "properties": {
          "booking_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{32}$",
            "description": "The booking_id book_meeting returned."
          }
        }
      },
      "page": "/"
    }
    cancel_bookingSensitive Action

    Cancelling, in the booking guide (get_booking_guide). A request the person hasn't signed in on yet is withdrawn at once. A booked call is not cancelled by this call: you get a confirm_url for the person to sign in on and cancel it (or, for a call booked by email, the person is emailed a link). Only use this when the person has asked to cancel. Do not retry on error.

    View tool JSON
    {
      "name": "cancel_booking",
      "kind": "transact",
      "impl": "imperative",
      "description": "Cancelling, in the booking guide (get_booking_guide). A request the person hasn't signed in on yet is withdrawn at once. A booked call is not cancelled by this call: you get a confirm_url for the person to sign in on and cancel it (or, for a call booked by email, the person is emailed a link). Only use this when the person has asked to cancel. Do not retry on error.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "booking_id"
        ],
        "properties": {
          "booking_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{32}$",
            "description": "The booking_id book_meeting returned."
          }
        }
      },
      "page": "/"
    }