{"ok":true,"site":{"host":"salih.dev","url":"https://salih.dev/","type":"live","desc":"Salih Güler is a Senior Developer Advocate at AWS focused on frontend and mobile app development, developer experience, and serverless architecture.","tools":[{"name":"get_site_overview","kind":"answer","impl":"imperative","description":"Summarize salih.dev: where Salih Güler is right now, how many blog posts, talks, and events it lists, his next event, the latest post, and the exact category, tag, topic, and event-type values the other tools accept as filters. Call this first when you are unsure which filter values exist.","title":"Site overview","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/talks/","/blog/making-my-personal-website-callable-for-ai-agents-with-webmcp-38aj/","/blog/7-tips-to-make-your-ai-agent-more-predictable-1ga4/","/blog/building-an-agent-friendly-personal-website-with-specs-11b4/","/blog/building-a-geography-game-with-a-custom-aws-block-2l01/"]},{"name":"search_site","kind":"answer","impl":"imperative","description":"Full-text search across Salih Güler's blog posts, conference talks, and speaking events. Every word in the query must match. Returns the type, title, canonical URL, date, and a short snippet for each hit, best match first.","title":"Search posts, talks, and events","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Words to look for, for example 'flutter amplify' or 'agents'."},"types":{"type":"array","items":{"type":"string","enum":["post","talk","event"]},"description":"Restrict results to these content types. Omit to search all three."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Maximum number of results (default 10, at most 50)."}},"required":["query"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/talks/","/blog/making-my-personal-website-callable-for-ai-agents-with-webmcp-38aj/","/blog/7-tips-to-make-your-ai-agent-more-predictable-1ga4/","/blog/building-an-agent-friendly-personal-website-with-specs-11b4/","/blog/building-a-geography-game-with-a-custom-aws-block-2l01/"]},{"name":"list_blog_posts","kind":"answer","impl":"imperative","description":"List Salih Güler's published blog posts, newest first. Optionally narrow by category, tag (exact values from get_site_overview), or words in the title, tags, and description. Each post has its canonical URL and a Markdown URL with the full text.","title":"List blog posts","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Words to match in the post."},"category":{"type":"string","description":"Exact category name."},"tag":{"type":"string","description":"Exact tag name."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Maximum number of results (default 10, at most 50)."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/talks/","/blog/making-my-personal-website-callable-for-ai-agents-with-webmcp-38aj/","/blog/7-tips-to-make-your-ai-agent-more-predictable-1ga4/","/blog/building-an-agent-friendly-personal-website-with-specs-11b4/","/blog/building-a-geography-game-with-a-custom-aws-block-2l01/"]},{"name":"read_blog_post","kind":"answer","impl":"imperative","description":"Get one blog post by its slug or URL. Returns its metadata and, unless includeMarkdown is false, the full post as Markdown so you can answer questions about it or quote it with a link to the canonical URL.","title":"Read a blog post","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"slug":{"type":"string","description":"The post slug (from list_blog_posts) or its salih.dev URL."},"includeMarkdown":{"type":"boolean","description":"Include the full Markdown body (default true)."}},"required":["slug"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/talks/","/blog/making-my-personal-website-callable-for-ai-agents-with-webmcp-38aj/","/blog/7-tips-to-make-your-ai-agent-more-predictable-1ga4/","/blog/building-an-agent-friendly-personal-website-with-specs-11b4/","/blog/building-a-geography-game-with-a-custom-aws-block-2l01/"]},{"name":"list_talks","kind":"answer","impl":"imperative","description":"List conference and community talks Salih Güler has given, newest first, each with the event, date, location, slide deck URL, recording URL when one exists, and source code URL when one exists. Optionally narrow by topic, event type (exact values from get_site_overview), year, whether a recording exists, or words in the title and event.","title":"List past talks","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Words to match in the talk or event."},"topic":{"type":"string","description":"Exact topic tag, for example 'Flutter'."},"eventType":{"type":"string","description":"Exact event type, for example 'Conference'."},"year":{"type":"integer","description":"Only talks given in this year."},"hasRecording":{"type":"boolean","description":"true for talks with a video recording, false for talks without one."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Maximum number of results (default 10, at most 50)."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/talks/","/blog/making-my-personal-website-callable-for-ai-agents-with-webmcp-38aj/","/blog/7-tips-to-make-your-ai-agent-more-predictable-1ga4/","/blog/building-an-agent-friendly-personal-website-with-specs-11b4/","/blog/building-a-geography-game-with-a-custom-aws-block-2l01/"]},{"name":"list_events","kind":"answer","impl":"imperative","description":"List the conferences and events where Salih Güler speaks or runs workshops. 'upcoming' (the default) lists events that have not ended yet, soonest first; 'past' lists finished events, most recent first; 'all' lists both. Each event has its dates, city, country, role, and event website.","title":"List speaking events","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"when":{"type":"string","enum":["upcoming","past","all"],"description":"Which events to list (default 'upcoming')."},"query":{"type":"string","description":"Words to match in the event name, city, or country."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Maximum number of results (default 10, at most 50)."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/talks/","/blog/making-my-personal-website-callable-for-ai-agents-with-webmcp-38aj/","/blog/7-tips-to-make-your-ai-agent-more-predictable-1ga4/","/blog/building-an-agent-friendly-personal-website-with-specs-11b4/","/blog/building-a-geography-game-with-a-custom-aws-block-2l01/"]},{"name":"get_speaker_kit","kind":"answer","impl":"imperative","description":"Get what an event organizer needs to invite Salih Güler as a speaker: his role and bio, focus areas, the topics he has spoken on with talk counts, his most recent talks with slide and recording URLs, the events he is already booked for, and how to contact him. Use this when someone wants to invite him, check his availability, or write a speaker introduction.","title":"Speaker kit","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/talks/","/blog/making-my-personal-website-callable-for-ai-agents-with-webmcp-38aj/","/blog/7-tips-to-make-your-ai-agent-more-predictable-1ga4/","/blog/building-an-agent-friendly-personal-website-with-specs-11b4/","/blog/building-a-geography-game-with-a-custom-aws-block-2l01/"]},{"name":"show_talks_on_page","kind":"act","impl":"imperative","description":"Apply one of the Talks page's own filters so the visitor sees only matching talks. Pass a topic or event type label exactly as the page shows it (get_site_overview lists them), or 'All talks' to reset. Changes only what is shown on this page.","title":"Filter the Talks page","inputSchema":{"type":"object","properties":{"filter":{"type":"string","description":"Filter label, for example 'Flutter' or 'All talks'."}},"required":["filter"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/talks/","pages":["/talks/"]}],"category":"Media & Personal","favicon":"/favicons/salih.dev.png","apiSurface":"spec","toolCount":8}}