{"tools":[{"name":"eval_expression","description":"Evaluate a safe JavaScript expression (math, JSON, Date, String, Array operations)","example":"{\"code\": \"1 + 2 * 3\"}"},{"name":"web_search","description":"Search the web using Brave Search API. Use this when you need to find current information, facts, or answers that require live web data.","example":"{\"q\":\"how deep is the mediterranean sea\"}"},{"name":"get_time","description":"Get the current time in a specified timezone","example":"{\"timezone\": \"Australia/Sydney\"}"},{"name":"blog_search","description":"Search kurashizu's blog articles and Hacker News archive using semantic search. Returns results with relevance scores, source type (blog/news), and section headings. Use this when asked about content from the blog, technical articles, or tech news.","example":"{\"q\":\"Rust async programming\",\"topK\":5,\"source\":\"all\"}"},{"name":"blog_read","description":"Read the Markdown content of a blog article by its slug. Returns a chunk starting at `offset` with up to `maxLength` characters. If `has_more` is true, call again with `next_offset` to get the next chunk. Use this after blog_search returns a relevant result.","example":"{\"slug\":\"understanding-rust-async\",\"offset\":0,\"maxLength\":16000}"}],"functionDeclarations":[{"name":"eval_expression","description":"Evaluate a safe JavaScript expression (math, JSON, Date, String, Array operations)","parameters":{"type":"object","properties":{"code":{"type":"string","description":"JavaScript expression to evaluate"}},"required":["code"]}},{"name":"web_search","description":"Search the web using Brave Search API. Use this when you need to find current information, facts, or answers that require live web data.","parameters":{"type":"object","properties":{"q":{"type":"string","description":"The search query"}},"required":["q"]}},{"name":"get_time","description":"Get the current time in a specified timezone","parameters":{"type":"object","properties":{"timezone":{"type":"string","description":"Timezone identifier (e.g. \"Australia/Sydney\", \"Asia/Shanghai\", \"UTC\"). Defaults to UTC if not provided."}},"required":[]}},{"name":"blog_search","description":"Search kurashizu's blog articles and Hacker News archive using semantic search. Returns results with relevance scores, source type (blog/news), and section headings. Use this when asked about content from the blog, technical articles, or tech news.","parameters":{"type":"object","properties":{"q":{"type":"string","description":"The search query (natural language, not keywords)"},"topK":{"type":"number","description":"Number of results to return (1-15, default 5). Use more when exploring a broad topic.","default":5},"source":{"type":"string","enum":["all","blog","news"],"description":"Filter by content type: 'all' for everything, 'blog' for blog posts only, 'news' for HN news only.","default":"all"}},"required":["q"]}},{"name":"blog_read","description":"Read the Markdown content of a blog article by its slug. Returns a chunk starting at `offset` with up to `maxLength` characters. If `has_more` is true, call again with `next_offset` to get the next chunk. Use this after blog_search returns a relevant result.","parameters":{"type":"object","properties":{"slug":{"type":"string","description":"The article slug (e.g. 'understanding-rust-async'). Extract it from the blog_search result url."},"offset":{"type":"number","description":"Character offset to start reading from (default 0). Set to the response's `next_offset` to continue reading.","default":0},"maxLength":{"type":"number","description":"Maximum characters to return (1000-64000, default 16000). Use a smaller value for a quick summary, larger for full content.","default":16000}},"required":["slug"]}}]}