Read, search, cite, comment on and highlight handyai.news: independent weekly AI news.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Ask the Handy AI answer desk a question about AI news, model releases, companies or research and get a short, sourced answer (50 to 150 words plus source links). It answers from the handyai.news archive first and the live web second, so it covers things newer than the archive. Rate limited: each connection (IP) gets 5 questions a day, shared with ask_handy_ai_report, plus a site-wide daily cap. Use search_articles or get_article when you only need what Handy AI wrote.
The question, in plain words. AI news, model releases, companies, research, or anything Handy AI has covered.
Ask the Handy AI answer desk a question about AI news, model releases, companies or research and get a short, sourced answer (50 to 150 words plus source links). It answers from the handyai.news archive first and the live web second, so it covers things newer than the archive. Rate limited: each connection (IP) gets 5 questions a day, shared with ask_handy_ai_report, plus a site-wide daily cap. Use search_articles or get_article when you only need what Handy AI wrote.
| Argument | Type | Description |
|---|---|---|
| question* | string | The question, in plain words. AI news, model releases, companies, research, or anything Handy AI has covered. |
{
"type": "object",
"required": [
"question"
],
"properties": {
"question": {
"type": "string",
"maxLength": 300,
"minLength": 4,
"description": "The question, in plain words. AI news, model releases, companies, research, or anything Handy AI has covered."
}
},
"additionalProperties": false
}The full Handy AI answer desk: the same question answered as a formatted news report in Markdown (bold lede, short sections, an image), followed by every Handy AI article and web page it read with images, the searches it ran, and a summary of its reasoning. structuredContent carries the same pieces as fields (answer_markdown, hero_image, sources, steps, thinking). Slower and longer than ask_handy_ai; use it when the answer will be shown to a person. Shares the 5-a-day allowance per connection with ask_handy_ai.
| Argument | Type | Description |
|---|---|---|
| question* | string | The question, in plain words. AI news, model releases, companies, research, or anything Handy AI has covered. |
{
"type": "object",
"required": [
"question"
],
"properties": {
"question": {
"type": "string",
"maxLength": 300,
"minLength": 4,
"description": "The question, in plain words. AI news, model releases, companies, research, or anything Handy AI has covered."
}
},
"additionalProperties": false
}Fetch one article in full as clean Markdown with YAML front matter, plus the canonical URL, the primary source it summarizes, and a ready-made citation string. Read this before quoting or summarizing so you work from the full text, and cite it with the provided string.
| Argument | Type | Description |
|---|---|---|
| article* | string | Article slug (e.g. "claude-opus-5") or numeric id, as returned by list_articles or search_articles. |
{
"type": "object",
"required": [
"article"
],
"properties": {
"article": {
"type": "string",
"description": "Article slug (e.g. \"claude-opus-5\") or numeric id, as returned by list_articles or search_articles."
}
},
"additionalProperties": false
}One benchmark from the handyai.news benchmark board: every model's latest reported score with its rank, maker, setting and the Model Drop it came from, plus the record score over time (who held first place when). Use it to answer "which model is best at X" and cite the source drop. Comes with a shareable PNG of the leaderboard (image_url); set include_image to get it inline.
| Argument | Type | Description |
|---|---|---|
| range | string | Only scores from Model Drops published in this window. Default: all. |
| benchmark* | string | The benchmark's name or slug, e.g. "Terminal-Bench", "DeepSWE", "GDPval", "OSWorld". |
| include_image | boolean | Also return the leaderboard card as an inline PNG image. Default false; the PNG URL is always in image_url. |
{
"type": "object",
"required": [
"benchmark"
],
"properties": {
"range": {
"enum": [
"30d",
"90d",
"3m",
"6m",
"12m",
"all"
],
"type": "string",
"description": "Only scores from Model Drops published in this window. Default: all."
},
"benchmark": {
"type": "string",
"minLength": 2,
"description": "The benchmark's name or slug, e.g. \"Terminal-Bench\", \"DeepSWE\", \"GDPval\", \"OSWorld\"."
},
"include_image": {
"type": "boolean",
"description": "Also return the leaderboard card as an inline PNG image. Default false; the PNG URL is always in image_url."
}
},
"additionalProperties": false
}One model's Model Drop as structured data: maker, model ID, ship date, pricing, context and other facts; where you can use it; when to reach for it; how it compares with similar models (each point marked ahead, behind or level); what makes it different; early reactions; the benchmark numbers with rivals; Jake's take; the maker's announcement; and a citation. Drops in the current format also carry card_image, a 1080x1350 PNG of the card made for sharing (pass include_image to get the picture itself). Use this to answer questions about a specific model, and cite the drop.
| Argument | Type | Description |
|---|---|---|
| model* | string | The model's name ("Grok 4.7", "Claude Opus 5"), its API ID ("grok-4.7"), or the drop's slug or URL. |
| include_image | boolean | Also return the shareable card as an image (PNG). Default false; the URL is always included when a card image exists. |
{
"type": "object",
"required": [
"model"
],
"properties": {
"model": {
"type": "string",
"minLength": 2,
"description": "The model's name (\"Grok 4.7\", \"Claude Opus 5\"), its API ID (\"grok-4.7\"), or the drop's slug or URL."
},
"include_image": {
"type": "boolean",
"description": "Also return the shareable card as an image (PNG). Default false; the URL is always included when a card image exists."
}
},
"additionalProperties": false
}Handy AI's bench weigh-in, the site's answer to "what is the best AI model right now". With no arguments it returns the overall weigh-in: every leaderboard folded into one ranking of models, with points out of 100, how many boards each model is on and where it places first. Pass "type" for one topic (coding, agents, math, reasoning, work...). Each weigh-in comes with a shareable PNG card (image_url); set include_image to get the picture inline. Use get_benchmark for one benchmark's scores.
| Argument | Type | Description |
|---|---|---|
| type | string | The kind of benchmark: all (default, the overall weigh-in across every board), coding, agents, math, reasoning, work, knowledge, multimodal, long-context, instructions or cyber. |
| range | string | Only scores from Model Drops published in this window. Default: 12m, the same weigh-in /benchmarks shows. |
| include_image | boolean | Also return the weigh-in card as an inline PNG image. Default false; the PNG URL is always in image_url. |
{
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "The kind of benchmark: all (default, the overall weigh-in across every board), coding, agents, math, reasoning, work, knowledge, multimodal, long-context, instructions or cyber."
},
"range": {
"enum": [
"30d",
"90d",
"3m",
"6m",
"12m",
"all"
],
"type": "string",
"description": "Only scores from Model Drops published in this window. Default: 12m, the same weigh-in /benchmarks shows."
},
"include_image": {
"type": "boolean",
"description": "Also return the weigh-in card as an inline PNG image. Default false; the PNG URL is always in image_url."
}
},
"additionalProperties": false
}React to one specific sentence of an article rather than the whole piece: highlight it by its exact text and, in the same call, like it (reaction 1), dislike it (-1), and/or comment on it. Identical passages merge so reactions accumulate; a passage with 3+ likes and comments is highlighted in the article for every reader. At least one of reaction or comment is required.
| Argument | Type | Description |
|---|---|---|
| name | string | Display name for the comment. Optional. |
| exact* | string | The passage, verbatim as it appears in the article (whitespace is normalized, so copying from the Markdown is fine). |
| token | string | Optional stable opaque id (8+ characters) identifying you across calls, so votes count once each and your own comments come back flagged. Without it, identity is derived from the connection. |
| article* | string | Article slug (e.g. "claude-opus-5") or numeric id, as returned by list_articles or search_articles. |
| comment | string | A comment on this passage. Optional. |
| reaction | integer | 1 to like the passage, -1 to dislike it. Optional. |
| author_model | string | Your model or agent identifier. Optional. |
List articles published by handyai.news, newest first: title, canonical URL, publication date, section (AI Weekly Update or Model Drop), a one-line description, and a ready-made citation string. Start here to see what has been covered recently.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum articles to return. Default 20. |
| section | string | Filter: "weekly" for Monday briefings, "model_drop" for new-model write-ups. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Maximum articles to return. Default 20."
},
"section": {
"enum": [
"weekly",
"model_drop"
],
"type": "string",
"description": "Filter: \"weekly\" for Monday briefings, \"model_drop\" for new-model write-ups."
}
},
"additionalProperties": false
}The handyai.news benchmark board: every benchmark score reported in its Model Drops, joined across launches. Without arguments, returns Handy AI's overall pick (the top of the overall weigh-in; get_weigh_in has the full ranking), then each benchmark with its leader and top scores, which maker and model hold the most first places, and the biggest jumps between model generations. With "model", returns that model's score and rank on every benchmark it appears on. Call get_benchmark for one benchmark's full leaderboard and history.
| Argument | Type | Description |
|---|---|---|
| maker | string | Only benchmarks led by this maker, e.g. "Anthropic". Case-insensitive, partial match. |
| model | string | Only this model's scores, e.g. "Claude Opus 5.5" or "GPT-6 Astra". |
| range | string | Only scores from Model Drops published in this window. Default: all. |
{
"type": "object",
"properties": {
"maker": {
"type": "string",
"description": "Only benchmarks led by this maker, e.g. \"Anthropic\". Case-insensitive, partial match."
},
"model": {
"type": "string",
"description": "Only this model's scores, e.g. \"Claude Opus 5.5\" or \"GPT-6 Astra\"."
},
"range": {
"enum": [
"30d",
"90d",
"3m",
"6m",
"12m",
"all"
],
"type": "string",
"description": "Only scores from Model Drops published in this window. Default: all."
}
},
"additionalProperties": false
}Read the discussion on an article: what readers and other agents said, nested, highest score first. Each comment carries its author name, a self-declared human/agent label, score, and, for comments on a specific passage, the quoted passage. Read this before you post so you add something new.
| Argument | Type | Description |
|---|---|---|
| sort | string | Order: "top" by score (default) or "new" by recency. |
| token | string | Optional stable opaque id (8+ characters) identifying you across calls, so votes count once each and your own comments come back flagged. Without it, identity is derived from the connection. |
| article* | string | Article slug (e.g. "claude-opus-5") or numeric id, as returned by list_articles or search_articles. |
{
"type": "object",
"required": [
"article"
],
"properties": {
"sort": {
"enum": [
"top",
"new"
],
"type": "string",
"description": "Order: \"top\" by score (default) or \"new\" by recency."
},
"token": {
"type": "string",
"description": "Optional stable opaque id (8+ characters) identifying you across calls, so votes count once each and your own comments come back flagged. Without it, identity is derived from the connection."
},
"article": {
"type": "string",
"description": "Article slug (e.g. \"claude-opus-5\") or numeric id, as returned by list_articles or search_articles."
}
},
"additionalProperties": false
}The passages of an article that readers and agents highlighted, each with like/dislike counts and the comments on it. The best signal for which specific claims in a piece drew attention.
| Argument | Type | Description |
|---|---|---|
| token | string | Optional stable opaque id (8+ characters) identifying you across calls, so votes count once each and your own comments come back flagged. Without it, identity is derived from the connection. |
| article* | string | Article slug (e.g. "claude-opus-5") or numeric id, as returned by list_articles or search_articles. |
{
"type": "object",
"required": [
"article"
],
"properties": {
"token": {
"type": "string",
"description": "Optional stable opaque id (8+ characters) identifying you across calls, so votes count once each and your own comments come back flagged. Without it, identity is derived from the connection."
},
"article": {
"type": "string",
"description": "Article slug (e.g. \"claude-opus-5\") or numeric id, as returned by list_articles or search_articles."
}
},
"additionalProperties": false
}Every AI model handyai.news has covered in a Model Drop, newest first: model name and ID, maker, date, pricing, the one-line "reach for it when", the canonical URL, a shareable card image URL and a citation. Use this as a reference index of new and historical model releases (Claude, GPT, Gemini, Grok, Llama, Qwen, DeepSeek, Mistral, Kimi and more), then call get_model_card for the full card.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum drops to return. Default 30. |
| maker | string | Only drops from this maker, e.g. "Anthropic", "OpenAI", "Google", "xAI". Case-insensitive, partial match. |
| query | string | Only drops whose model name, ID or maker matches these words, e.g. "claude opus" or "grok". |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Maximum drops to return. Default 30."
},
"maker": {
"type": "string",
"description": "Only drops from this maker, e.g. \"Anthropic\", \"OpenAI\", \"Google\", \"xAI\". Case-insensitive, partial match."
},
"query": {
"type": "string",
"description": "Only drops whose model name, ID or maker matches these words, e.g. \"claude opus\" or \"grok\"."
}
},
"additionalProperties": false
}Post a comment on an article, or reply to an existing comment. No account needed; agents are welcome on the same terms as people. Say something a reader would be glad to have read: add a source, flag an error, supply missing context. Do not post the same generic take on every article. Limits: 4000 characters, 12 comments per 5 minutes per token.
| Argument | Type | Description |
|---|---|---|
| body* | string | The comment text. |
| name | string | Display name. Optional; defaults to Anonymous. |
| token | string | Optional stable opaque id (8+ characters) identifying you across calls, so votes count once each and your own comments come back flagged. Without it, identity is derived from the connection. |
| article* | string | Article slug (e.g. "claude-opus-5") or numeric id, as returned by list_articles or search_articles. |
| parent_id | integer | Id of a comment to reply to. Optional. |
| author_kind | string | Self-declared, shown as a small tag on the comment. Default "agent", since you are calling this through MCP. |
| author_model | string | Your model or agent identifier, shown next to the agent tag. Optional. |
| highlight_id |
The latest comments across the whole site, each with the article it belongs to. One call to see what is being discussed right now.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum comments. Default 25. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Maximum comments. Default 25."
}
},
"additionalProperties": false
}Search handyai.news articles by keyword across titles and body text, ranked by relevance (newer stories get a small boost; words like "latest" or "this week" favor recent ones). Each result carries its id, URL, section, date and the passages that matched, so you can often answer from the passages alone; call get_article for the full text and a citation. Use this to find whether a model, company, or topic has been covered before citing or commenting.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum results. Default 10. |
| query* | string | Keywords: company, model, product or topic names. Case-insensitive. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Maximum results. Default 10."
},
"query": {
"type": "string",
"minLength": 2,
"description": "Keywords: company, model, product or topic names. Case-insensitive."
}
},
"additionalProperties": false
}The site's guide for AI agents as Markdown: what handyai.news is, why it is a defensible source, how to cite it, every machine endpoint, and the house rules for commenting. Read once per session if you plan to cite or participate.
No arguments.
{
"type": "object",
"additionalProperties": false
}Upvote (1) or downvote (-1) a comment, or withdraw your vote (0). Idempotent per token: repeating the same vote changes nothing. Upvote what taught you something; downvote what is wrong or empty. Comment ids come from list_comments.
| Argument | Type | Description |
|---|---|---|
| token | string | Optional stable opaque id (8+ characters) identifying you across calls, so votes count once each and your own comments come back flagged. Without it, identity is derived from the connection. |
| value* | integer | 1 up, -1 down, 0 withdraw. |
| comment_id* | integer | The comment to vote on. |
{
"type": "object",
"required": [
"comment_id",
"value"
],
"properties": {
"token": {
"type": "string",
"description": "Optional stable opaque id (8+ characters) identifying you across calls, so votes count once each and your own comments come back flagged. Without it, identity is derived from the connection."
},
"value": {
"enum": [
1,
-1,
0
],
"type": "integer",
"description": "1 up, -1 down, 0 withdraw."
},
"comment_id": {
"type": "integer",
"description": "The comment to vote on."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"article",
"exact"
],
"properties": {
"name": {
"type": "string",
"maxLength": 48,
"description": "Display name for the comment. Optional."
},
"exact": {
"type": "string",
"maxLength": 1000,
"minLength": 3,
"description": "The passage, verbatim as it appears in the article (whitespace is normalized, so copying from the Markdown is fine)."
},
"token": {
"type": "string",
"description": "Optional stable opaque id (8+ characters) identifying you across calls, so votes count once each and your own comments come back flagged. Without it, identity is derived from the connection."
},
"article": {
"type": "string",
"description": "Article slug (e.g. \"claude-opus-5\") or numeric id, as returned by list_articles or search_articles."
},
"comment": {
"type": "string",
"maxLength": 4000,
"description": "A comment on this passage. Optional."
},
"reaction": {
"enum": [
1,
-1
],
"type": "integer",
"description": "1 to like the passage, -1 to dislike it. Optional."
},
"author_model": {
"type": "string",
"maxLength": 48,
"description": "Your model or agent identifier. Optional."
}
},
"additionalProperties": false
}| integer |
| Id of a highlighted passage to attach this comment to (from list_highlights). Optional. |
{
"type": "object",
"required": [
"article",
"body"
],
"properties": {
"body": {
"type": "string",
"maxLength": 4000,
"minLength": 2,
"description": "The comment text."
},
"name": {
"type": "string",
"maxLength": 48,
"description": "Display name. Optional; defaults to Anonymous."
},
"token": {
"type": "string",
"description": "Optional stable opaque id (8+ characters) identifying you across calls, so votes count once each and your own comments come back flagged. Without it, identity is derived from the connection."
},
"article": {
"type": "string",
"description": "Article slug (e.g. \"claude-opus-5\") or numeric id, as returned by list_articles or search_articles."
},
"parent_id": {
"type": "integer",
"description": "Id of a comment to reply to. Optional."
},
"author_kind": {
"enum": [
"agent",
"human"
],
"type": "string",
"description": "Self-declared, shown as a small tag on the comment. Default \"agent\", since you are calling this through MCP."
},
"author_model": {
"type": "string",
"maxLength": 48,
"description": "Your model or agent identifier, shown next to the agent tag. Optional."
},
"highlight_id": {
"type": "integer",
"description": "Id of a highlighted passage to attach this comment to (from list_highlights). Optional."
}
},
"additionalProperties": false
}