{"ok":true,"site":{"host":"patrickjv.com","url":"https://patrickjv.com/","type":"live","desc":"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.","tools":[{"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.","title":"Profile","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"list_work","kind":"answer","impl":"imperative","description":"Selected work: title, summary and tags for each item.","title":"Selected work","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"list_skills","kind":"answer","impl":"imperative","description":"Patrick Vieira's listed skills.","title":"Skills","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"list_faq","kind":"answer","impl":"imperative","description":"Quick answers about Patrick Vieira: each question (q) with its answer (a).","title":"Quick answers","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"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.","title":"Request an introduction","annotations":{"readOnlyHint":false},"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."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"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.","title":"How to book","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"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.","title":"Meeting types","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"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.","title":"Free times","annotations":{"readOnlyHint":true},"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."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"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.","title":"Book a meeting","annotations":{"readOnlyHint":false},"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."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"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.","title":"Booking status","annotations":{"readOnlyHint":true},"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."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"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.","title":"Cancel a booking","annotations":{"readOnlyHint":false},"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."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]}],"category":"Media & Personal","favicon":"/favicons/patrickjv.com.png","apiSurface":"spec","toolCount":11}}