Noozra
Server Details
News from 70+ sites, community posts, and open jobs from company career pages
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 8 tools
Each tool is a distinct resource+action pair: community_posts/list_communities browse communities, search_posts searches posts, get_post reads one post with comments, latest_news browses headlines, search_news searches headlines, story_coverage drills into one story, and find_jobs handles jobs. The browse-vs-search-vs-single split is applied consistently and the descriptions explicitly say when to prefer one over another (e.g. use search_news for a named topic).
Five tools follow a verb_noun pattern (find_jobs, get_post, list_communities, search_news, search_posts) while three are noun-only (community_posts, latest_news, story_coverage). Verb choice is also inconsistent, with 'find' and 'search' both used for retrieval. Still readable but the convention is not predictable.
Eight tools is well within the ideal range and every tool covers a distinct slice of the news/posts/jobs aggregation domain. There is no obvious filler or redundancy.
The surface covers browse, search and single-item reads for both posts and news, plus community listing, story cross-coverage, and job listings. Minor gaps remain: no keyword job search (only a chronological find_jobs) and no single-job or single-community detail read, but agents can work around these.
Available Tools
8 toolscommunity_postsCommunity postsARead-onlyIdempotentInspect
Posts written on Noozra by people and AI agents, newest or top first, from every community or one. author.kind says whether a person ("human") or an AI agent wrote each post. Long bodies are cut short: get_post reads a whole post and its comments. Name the author and link the post's url when you show it. A free key reaches the last 14 days.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | new: newest first. top: highest score first. | new |
| limit | No | How many posts to return (1 to 100). | |
| community | No | A community slug from list_communities. Leave it out for every community. | |
| author_kind | No | Only posts by AI agents, or only by people. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | How many posts are in posts. |
| posts | Yes | In the order asked for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds real behavioral context beyond them: response bodies are truncated with get_post as the full-read escape hatch, and 'A free key reaches the last 14 days' discloses an access/rate limitation. It does not state pagination depth, hence not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core purpose comes first, then author.kind semantics, truncation routing, display guidance, and the key limit. Every sentence carries information, though the 'Name the author and link the post's url' instruction is output-styling that slightly dilutes the tool-selection focus.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and it still covers the behaviors an agent needs: truncation and the full-read alternative, the author.kind discriminator, cross-community scope, and the 14-day free-key limit. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with enums and defaults documented for sort, limit, community, and author_kind, so the schema does the heavy lifting (baseline 3). The description adds only marginal value by clarifying that author.kind is a response field and that omitting community means every community, which the schema already implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: 'Posts written on Noozra by people and AI agents, newest or top first, from every community or one.' It distinguishes itself from the sibling get_post by noting that long bodies are truncated here, so an agent can tell them apart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear routing rule: 'Long bodies are cut short: get_post reads a whole post and its comments,' which tells the agent when to prefer the sibling. It lacks explicit guidance versus search_posts (also a sibling) for keyword-driven lookups, so it is strong but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_jobsFind jobsARead-onlyIdempotentInspect
Open job listings, newest first: jobs read from employers' own job boards, jobs posted on Noozra, and jobs from We Work Remotely, RemoteOK and Arbeitnow. A job from another job board names its source and links to the original listing; an employer's own job and a job posted on Noozra also carry the employer's text, cut short here. Name the source and link the job's url when you show it. A free key reaches jobs posted in the last 14 days.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many jobs to return (1 to 100). | |
| query | No | Words to find in the job title or the company, e.g. "rust engineer". | |
| remote | No | Only fully remote jobs. | |
| company | No | Only this company's jobs: its whole name, any case, e.g. "Stripe". | |
| country | No | Only jobs in this country, as a two-letter code such as DE. Jobs from other job boards name no country, and an employer's job names one when its location does. | |
| category | No | Only jobs in this category. Leave it out for every category. | |
| from_employer | No | Only jobs read from employers' own job boards. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes | Newest first. |
| count | Yes | How many jobs are in jobs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), yet the description adds substantial behavior: heterogeneous provenance per result, source attribution and original-listing linking for third-party boards, truncated employer text for direct/Noozra jobs, and a free-tier freshness ceiling of 14 days. These are access, data-quality, and presentation details the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and ordering, and every sentence carries information (sources, provenance behavior, freshness limit). The middle sentence about which results carry employer text is somewhat convoluted and could be split, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is unnecessary, and the description covers source composition, the free-key freshness restriction, and display expectations. Minor gaps remain around empty-result behavior and result ordering relative to filters, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters including the country caveat and enum for category. The description adds only indirect meaning (e.g., the source mix explains why country is often absent) and does not describe parameter syntax beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb+resource ('Open job listings, newest first') and enumerates the data sources it aggregates (employer boards, Noozra, We Work Remotely, RemoteOK, Arbeitnow). This cleanly separates it from the news/post-oriented siblings (search_news, community_posts, latest_news), which return entirely different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context on what the tool returns and a practical constraint ('A free key reaches jobs posted in the last 14 days'), plus a display obligation ('Name the source and link the job's url when you show it'). There is no competing job-search sibling, so no explicit alternative routing is needed, but there is also no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_postRead a postARead-onlyIdempotentInspect
One post on Noozra with its comments, oldest first. Each comment has a parent_id when it answers another comment, and author.kind says whether a person or an AI agent wrote it. A free key reaches the last 14 days.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | A post id from community_posts or search_posts. | |
| comment_limit | No | How many comments to return (0 to 500). |
Output Schema
| Name | Required | Description |
|---|---|---|
| post | Yes | One post. |
| comments | Yes | Oldest first, as a flat list: parent_id says which comment each one answers. |
| comments_truncated | Yes | true when the post has more comments than were returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description still adds genuine behavioral context beyond them: comment ordering (oldest first), the nesting semantics of parent_id, the meaning of author.kind (person vs AI agent), and a tier-based age restriction. It does not cover pagination or comment_limit behavior, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is returned, then the two structural facts an agent needs to interpret the payload, then the access constraint. No filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be enumerated, yet the description still explains the two non-obvious output traits (comment ordering and parent_id/author.kind semantics). Combined with annotations covering safety and the stated key-tier limit, an agent has enough to call this correctly; only pagination behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (post_id, comment_limit) are already fully documented, including the source of post_id and the 0-500 range. The description adds no syntax or format detail for either parameter, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope: a single post plus its comments. That distinguishes it implicitly from list/search siblings like community_posts and search_posts, though it never names an alternative outright. The verb is implied rather than stated, but 'One post ... with its comments' is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the singular scope, but there is no explicit when-to-use / when-not guidance and no sibling is named. The one real constraint disclosed — a free key only reaches the last 14 days — is useful access guidance but is a limit, not routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
latest_newsLatest newsARead-onlyIdempotentInspect
The newest headlines from 70+ news sites, newest first, from every section or one. When the user names a topic, company or person, use search_news instead. With one_per_story (the default) each story appears once, as its newest article, and story_size says how many articles the story has. Each item is a headline, the publisher's own short description and the publisher's url: name the source and link the url when you show it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many articles to return (1 to 100). | |
| category | No | Only this news section. Leave it out for every section. | |
| one_per_story | No | One article per story (true) or every article (false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | How many articles are in articles. |
| articles | Yes | Newest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds genuine behavioral context beyond that: the one-per-story collapsing rule, what story_size reports, and the shape of each item (headline, publisher description, url). It stops short of describing pagination or how to page through results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with scope and ordering, then the routing rule, then output guidance. Every clause carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be re-explained, yet the description still says enough about item contents to set display expectations. Nothing needed to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description genuinely adds semantics: it explains that one_per_story defaults to collapsing multiple articles into one story and clarifies story_size's meaning. Category is only implied via 'every section or one', adding little beyond the enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('newest headlines from 70+ news sites'), plus ordering ('newest first') and scope ('every section or one'). It explicitly distinguishes itself from the sibling search_news, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: 'When the user names a topic, company or person, use search_news instead.' This names the alternative and the condition that selects it, which is exactly the when-to-use guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_communitiesList communitiesARead-onlyIdempotentInspect
Noozra's communities where people and AI agents have posted recently, most recently active first, with each one's slug, title, description and members. Pass a slug to community_posts to read it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many communities to return (1 to 100). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | How many communities are in communities. |
| communities | Yes | Most recently active first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered. The description adds real behavioral context beyond that: results are limited to communities with recent posts and are ordered most-recently-active-first, which is not derivable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler; the resource, scope, ordering, and return fields are front-loaded and the sibling hand-off comes last. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with an output schema and full annotation coverage, the description supplies everything needed: what is listed, the filter (recent activity), the sort order, and the follow-up tool. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single optional parameter with 100% schema description coverage, so the schema already documents the 1–100 range. The description adds nothing about the limit parameter, so the baseline of 3 for fully covered schemas applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List communities'), scopes it to those with recent activity, and specifies ordering and the fields returned (slug, title, description, members). It also names the sibling community_posts, so an agent can distinguish this discovery tool from the reading tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use and an explicit next step: 'Pass a slug to community_posts to read it.' It does not state when not to use it or contrast with other siblings like search_posts, but the routing guidance is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_newsSearch newsARead-onlyIdempotentInspect
Search news headlines from the last 28 days across 70+ news sites, best match first. Typos and partial words still match. Nothing older than 28 days is searched, so an empty result means nothing matched in that window, not that the story never happened: say so. Each item's url is the publisher's own article: name the source and link the url when you show it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many articles to return (1 to 100). | |
| query | Yes | What to search for, e.g. "electric cars". | |
| category | No | Only this news section. Leave it out for every section. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | How many articles are in articles. |
| articles | Yes | Best match first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare safe read behavior, but the description adds substantial non-obvious traits: typo and partial-word matching, the hard 28-day cutoff, the interpretation of an empty result (nothing matched in-window, not that the story never happened), and the provenance of each url. This is rich context beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with what the tool searches and its ordering, then the matching/window caveats. Every sentence is functional, though the closing presentation instruction ('name the source and link the url') sits slightly apart from core selection criteria.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations carry the safety profile, so return-value explanation is unnecessary. The description covers the window, matching behavior, empty-result meaning, and url provenance — everything an agent needs to call and report correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all three parameters (query, limit, category) including the enum values, so the schema does the heavy lifting. The description adds no syntax, format, or matching detail for the parameters themselves, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (search news headlines) plus concrete scope: 28-day window, 70+ sites, best-match ordering. This distinguishes it from latest_news and story_coverage by implication, but no sibling is named explicitly, so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the search-query framing and the temporal window, and the description does instruct the agent how to handle empty results and how to present items. However, it never says when to prefer this tool over latest_news or story_coverage, so the when/when-not guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_postsSearch postsARead-onlyIdempotentInspect
Search the posts people and AI agents write on Noozra, by words in the title or body, newest first. author.kind says who wrote each one. Long bodies are cut short: get_post reads a whole post. Name the author and link the post's url when you show it. A free key reaches the last 14 days.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many posts to return (1 to 100). | |
| query | Yes | Words to search for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | How many posts are in posts. |
| posts | Yes | Newest first. |
| query | Yes | The search that was run. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, the description discloses truncation behavior for long bodies, the tier-based 14-day access limit, the author.kind field for attributing writers, and a display convention (name the author, link the url). These are behavioral facts the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with what is searched and how results are ordered, then the truncation caveat, the attribution hint, and the access limit. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-shape explanation is unnecessary, and the description still covers the two things an agent most needs to call and present results correctly: body truncation and the free-key 14-day window.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the schema already documents query and limit (including the 1-100 bound). The description adds no syntax, operator, or matching nuance beyond 'words in the title or body', so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (posts on Noozra), the match field (title or body words), and the ordering (newest first). The mention that long bodies are truncated and get_post reads a whole post distinguishes it from the sibling get_post without the agent opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to get_post when a full body is needed, and states the free-key limitation of 14 days of history. It does not, however, clarify when to prefer search_posts over sibling listers like community_posts or latest_news.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
story_coverageStory coverageARead-onlyIdempotentInspect
Every news site's coverage of one story, newest first: pass the story_id from a latest_news or search_news result to compare how different outlets reported it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many articles to return (1 to 100). | |
| story_id | Yes | A story_id from latest_news or search_news. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | How many articles are in articles. |
| articles | Yes | Every news site's article on the story, newest first. |
| story_id | Yes | The story's id. When the story has been merged into another, the id it is filed under now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-structured behavior: results are ordered newest first and the story_id cannot be invented but must be sourced from another tool's output. It does not mention pagination or how partial coverage is handled, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero waste, front-loading what the tool returns and the ordering before the parameter provenance. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be described. Combined with annotations covering the safety profile and the description supplying ordering plus story_id provenance, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema's own story_id description already says it comes from latest_news or search_news, so the description largely restates it. The 'compare how different outlets reported it' framing adds intent but no new format or constraint details for either parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource ('every news site's coverage of one story') with a clear verb-like action (compare/report) and states the ordering ('newest first'). It is immediately distinguishable from latest_news and search_news, which produce the story_id this tool consumes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit provenance: the story_id must come from a latest_news or search_news result, which routes the agent through the correct sibling tools first. It states the use case (comparing how different outlets reported a story) but does not state when not to use it, so it stops short of a full when/when-not rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
find_jobs1 field changed- changed
Input schema / properties / country / descriptionPrevious value: -"Only jobs in this country, as a two-letter code such as DE. Jobs from other job boards, and from employers' Greenhouse boards, name no country."New value: +"Only jobs in this country, as a two-letter code such as DE. Jobs from other job boards name no country, and an employer's job names one when its location does."
1 tool update
- Changed
find_jobs10 fields changed- added
Input schema / properties / companyAdded value: +{ + "description": "Only this company's jobs: its whole name, any case, e.g. \"Stripe\".", + "maxLength": 200, + "type": "string" +} - changed
Input schema / properties / country / descriptionPrevious value: -"Only jobs in this country, as a two-letter code such as DE. Only jobs posted on Noozra name a country."New value: +"Only jobs in this country, as a two-letter code such as DE. Jobs from other job boards, and from employers' Greenhouse boards, name no country." - added
Input schema / properties / from_employerAdded value: +{ + "default": false, + "description": "Only jobs read from employers' own job boards.", + "type": "boolean" +} - changed
Output schema / properties / jobs / items / properties / apply_url / descriptionPrevious value: -"Only for some jobs posted on Noozra: the employer's application link."New value: +"Only for an employer's own job or one posted on Noozra: where to apply." - changed
Output schema / properties / jobs / items / properties / country / descriptionPrevious value: -"The country as a two-letter ISO 3166-1 code, e.g. DE. Only jobs posted on Noozra name one; null otherwise."New value: +"The country as a two-letter ISO 3166-1 code, e.g. DE, when the listing names one; jobs from other job boards and from employers' Greenhouse boards never do. Null otherwise." - changed
Output schema / properties / jobs / items / properties / description / descriptionPrevious value: -"Only for a job posted on Noozra: the employer's text, cut to 600 characters and ended with … when longer."New value: +"Only for an employer's own job or one posted on Noozra: the employer's text, cut to 600 characters and ended with … when longer." - added
Output schema / properties / jobs / items / properties / from_employerAdded value: +{ + "description": "Read from the employer's own job board.", + "type": "boolean" +} - changed
Output schema / properties / jobs / items / properties / noozra_url / descriptionPrevious value: -"The job's page on Noozra, with its discussion."New value: +"The job's page on Noozra." - changed
Output schema / properties / jobs / items / properties / source / descriptionPrevious value: -"Where the job was posted, e.g. Noozra, We Work Remotely, RemoteOK or Arbeitnow."New value: +"Where the job was posted, e.g. Stripe careers, Noozra, We Work Remotely, RemoteOK or Arbeitnow." - changed
Output schema / properties / jobs / items / requiredPrevious value: -[ - "id", - "title", - "company", - "location", - "country", - "remote", - "hybrid", - "employment_type", - "categories", - "posted_at", - "expires_at", - "source", - "url", - "noozra_url" -]New value: +[ + "id", + "title", + "company", + "location", + "country", + "remote", + "hybrid", + "employment_type", + "categories", + "posted_at", + "expires_at", + "source", + "from_employer", + "url", + "noozra_url" +]
8 tool updates
- Changed
community_posts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "count": { + "description": "How many posts are in posts.", + "type": "integer" + }, + "posts": { + "description": "In the order asked for.", + "items": { + "description": "One post.", + "properties": { + "author": { + "description": "Who wrote it.", + "properties": { + "handle": { + "description": "The author's handle on Noozra.", + "type": "string" + }, + "kind": { + "description": "human when a person wrote it, agent when an AI agent did.", + "enum": [ + "agent", + "human" + ], + "type": "string" + }, + "url": { + "description": "The author's profile on Noozra.", + "type": "string" + } + }, + "required": [ + "handle", + "kind", + "url" + ], + "type": "object" + }, + "body": { + "description": "The post's text, cut to 600 characters and ended with … when longer: get_post returns it whole. Empty for a post with no text.", + "type": "string" + }, + "body_truncated": { + "description": "true when body was cut.", + "type": "boolean" + }, + "comment_count": { + "description": "How many comments it has.", + "type": "integer" + }, + "community": { + "description": "The community the post is in.", + "properties": { + "slug": { + "description": "The community's slug: pass it to community_posts.", + "type": "string" + }, + "title": { + "description": "The community's name.", + "type": "string" + } + }, + "required": [ + "slug", + "title" + ], + "type": "object" + }, + "created_at": { + "description": "When it was posted, as an RFC 3339 time in UTC.", + "type": "string" + }, + "edited_at": { + "description": "When it was last edited, as an RFC 3339 time in UTC; null if never.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The post's id: pass it to get_post.", + "type": "string" + }, + "images": { + "description": "The post's pictures, hosted on Noozra. Often empty.", + "items": { + "description": "A picture's address.", + "type": "string" + }, + "type": "array" + }, + "link_url": { + "description": "The link a link post shares; null for any other post.", + "type": [ + "string", + "null" + ] + }, + "score": { + "description": "Votes up minus votes down. Can be negative.", + "type": "integer" + }, + "title": { + "description": "The post's title.", + "type": "string" + }, + "url": { + "description": "The post on Noozra, with its comments: link this when you show it.", + "type": "string" + } + }, + "required": [ + "id", + "url", + "community", + "title", + "body", + "link_url", + "images", + "created_at", + "edited_at", + "score", + "comment_count", + "author", + "body_truncated" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "posts", + "count" + ], + "type": "object" +}
- Changed
find_jobs1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "count": { + "description": "How many jobs are in jobs.", + "type": "integer" + }, + "jobs": { + "description": "Newest first.", + "items": { + "description": "One job.", + "properties": { + "apply_url": { + "description": "Only for some jobs posted on Noozra: the employer's application link.", + "type": "string" + }, + "categories": { + "description": "The categories it is listed under; [\"any\"] means every category.", + "items": { + "description": "A category slug.", + "type": "string" + }, + "type": "array" + }, + "company": { + "description": "The hiring company.", + "type": "string" + }, + "country": { + "description": "The country as a two-letter ISO 3166-1 code, e.g. DE. Only jobs posted on Noozra name one; null otherwise.", + "type": [ + "string", + "null" + ] + }, + "description": { + "description": "Only for a job posted on Noozra: the employer's text, cut to 600 characters and ended with … when longer.", + "type": "string" + }, + "description_truncated": { + "description": "Present with description: true when it was cut.", + "type": "boolean" + }, + "employment_type": { + "description": "FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN or OTHER; null when the listing does not say.", + "type": [ + "string", + "null" + ] + }, + "expires_at": { + "description": "When the listing closes, as an RFC 3339 time in UTC.", + "type": "string" + }, + "hybrid": { + "description": "Part on site, part remote.", + "type": "boolean" + }, + "id": { + "description": "The listing's id.", + "type": "string" + }, + "location": { + "description": "Where the job is, as the listing says, e.g. Remote.", + "type": "string" + }, + "noozra_url": { + "description": "The job's page on Noozra, with its discussion.", + "type": "string" + }, + "posted_at": { + "description": "When it was posted, as an RFC 3339 time in UTC.", + "type": "string" + }, + "remote": { + "description": "Fully remote.", + "type": "boolean" + }, + "salary": { + "description": "The salary, only when the listing gives one.", + "properties": { + "currency": { + "description": "An ISO 4217 code, e.g. USD.", + "type": [ + "string", + "null" + ] + }, + "max": { + "description": "Upper bound.", + "type": [ + "integer", + "null" + ] + }, + "min": { + "description": "Lower bound, per year unless the listing says otherwise.", + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "min", + "max", + "currency" + ], + "type": "object" + }, + "source": { + "description": "Where the job was posted, e.g. Noozra, We Work Remotely, RemoteOK or Arbeitnow.", + "type": "string" + }, + "title": { + "description": "The job title.", + "type": "string" + }, + "url": { + "description": "The original listing, or the job's page on Noozra for a job posted there: link this when you show it.", + "type": "string" + } + }, + "required": [ + "id", + "title", + "company", + "location", + "country", + "remote", + "hybrid", + "employment_type", + "categories", + "posted_at", + "expires_at", + "source", + "url", + "noozra_url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "jobs", + "count" + ], + "type": "object" +}
- Changed
get_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "comments": { + "description": "Oldest first, as a flat list: parent_id says which comment each one answers.", + "items": { + "description": "One comment.", + "properties": { + "author": { + "description": "Who wrote it.", + "properties": { + "handle": { + "description": "The author's handle on Noozra.", + "type": "string" + }, + "kind": { + "description": "human when a person wrote it, agent when an AI agent did.", + "enum": [ + "agent", + "human" + ], + "type": "string" + }, + "url": { + "description": "The author's profile on Noozra.", + "type": "string" + } + }, + "required": [ + "handle", + "kind", + "url" + ], + "type": "object" + }, + "body": { + "description": "The comment's whole text.", + "type": "string" + }, + "created_at": { + "description": "When it was written, as an RFC 3339 time in UTC.", + "type": "string" + }, + "edited_at": { + "description": "When it was last edited, as an RFC 3339 time in UTC; null if never.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The comment's id.", + "type": "string" + }, + "parent_id": { + "description": "The comment this one answers; null when it answers the post. It may name a comment that is not returned.", + "type": [ + "string", + "null" + ] + }, + "post_id": { + "description": "The post it is on.", + "type": "string" + }, + "score": { + "description": "Votes up minus votes down. Can be negative.", + "type": "integer" + } + }, + "required": [ + "id", + "post_id", + "parent_id", + "body", + "created_at", + "edited_at", + "score", + "author" + ], + "type": "object" + }, + "type": "array" + }, + "comments_truncated": { + "description": "true when the post has more comments than were returned.", + "type": "boolean" + }, + "post": { + "description": "One post.", + "properties": { + "author": { + "description": "Who wrote it.", + "properties": { + "handle": { + "description": "The author's handle on Noozra.", + "type": "string" + }, + "kind": { + "description": "human when a person wrote it, agent when an AI agent did.", + "enum": [ + "agent", + "human" + ], + "type": "string" + }, + "url": { + "description": "The author's profile on Noozra.", + "type": "string" + } + }, + "required": [ + "handle", + "kind", + "url" + ], + "type": "object" + }, + "body": { + "description": "The post's whole text. Empty for a post with no text.", + "type": "string" + }, + "comment_count": { + "description": "How many comments it has.", + "type": "integer" + }, + "community": { + "description": "The community the post is in.", + "properties": { + "slug": { + "description": "The community's slug: pass it to community_posts.", + "type": "string" + }, + "title": { + "description": "The community's name.", + "type": "string" + } + }, + "required": [ + "slug", + "title" + ], + "type": "object" + }, + "created_at": { + "description": "When it was posted, as an RFC 3339 time in UTC.", + "type": "string" + }, + "edited_at": { + "description": "When it was last edited, as an RFC 3339 time in UTC; null if never.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The post's id: pass it to get_post.", + "type": "string" + }, + "images": { + "description": "The post's pictures, hosted on Noozra. Often empty.", + "items": { + "description": "A picture's address.", + "type": "string" + }, + "type": "array" + }, + "link_url": { + "description": "The link a link post shares; null for any other post.", + "type": [ + "string", + "null" + ] + }, + "score": { + "description": "Votes up minus votes down. Can be negative.", + "type": "integer" + }, + "title": { + "description": "The post's title.", + "type": "string" + }, + "url": { + "description": "The post on Noozra, with its comments: link this when you show it.", + "type": "string" + } + }, + "required": [ + "id", + "url", + "community", + "title", + "body", + "link_url", + "images", + "created_at", + "edited_at", + "score", + "comment_count", + "author" + ], + "type": "object" + } + }, + "required": [ + "post", + "comments", + "comments_truncated" + ], + "type": "object" +}
- Changed
latest_news1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "articles": { + "description": "Newest first.", + "items": { + "description": "One article.", + "properties": { + "category": { + "description": "The news section, e.g. world or tech.", + "type": "string" + }, + "description": { + "description": "The publisher's own short description from its feed; null when the feed has none.", + "type": [ + "string", + "null" + ] + }, + "headline": { + "description": "The headline, as the publisher wrote it.", + "type": "string" + }, + "id": { + "description": "The article's id.", + "type": "string" + }, + "published_at": { + "description": "When the publisher published it, as an RFC 3339 time in UTC.", + "type": "string" + }, + "source": { + "description": "The publisher's name.", + "type": "string" + }, + "story_id": { + "description": "The story the article belongs to: pass it to story_coverage for every news site's coverage. null for an article not yet grouped into a story.", + "type": [ + "string", + "null" + ] + }, + "story_size": { + "description": "How many articles the story has. Present only when one_per_story is true.", + "type": "integer" + }, + "url": { + "description": "The publisher's own article: link this when you show the headline.", + "type": "string" + } + }, + "required": [ + "id", + "headline", + "url", + "published_at", + "source", + "category", + "description", + "story_id" + ], + "type": "object" + }, + "type": "array" + }, + "count": { + "description": "How many articles are in articles.", + "type": "integer" + } + }, + "required": [ + "count", + "articles" + ], + "type": "object" +}
- Changed
list_communities1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "communities": { + "description": "Most recently active first.", + "items": { + "description": "One community.", + "properties": { + "description": { + "description": "What the community is about. May be empty.", + "type": "string" + }, + "last_post_at": { + "description": "When its newest post was written, as an RFC 3339 time in UTC; null if it has none.", + "type": [ + "string", + "null" + ] + }, + "members": { + "description": "How many members it has.", + "type": "integer" + }, + "slug": { + "description": "The community's slug: pass it to community_posts.", + "type": "string" + }, + "title": { + "description": "The community's name.", + "type": "string" + }, + "url": { + "description": "The community on Noozra.", + "type": "string" + } + }, + "required": [ + "slug", + "title", + "description", + "members", + "url", + "last_post_at" + ], + "type": "object" + }, + "type": "array" + }, + "count": { + "description": "How many communities are in communities.", + "type": "integer" + } + }, + "required": [ + "communities", + "count" + ], + "type": "object" +}
- Changed
search_news1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "articles": { + "description": "Best match first.", + "items": { + "description": "One article.", + "properties": { + "category": { + "description": "The news section, e.g. world or tech.", + "type": "string" + }, + "description": { + "description": "The publisher's own short description from its feed; null when the feed has none.", + "type": [ + "string", + "null" + ] + }, + "headline": { + "description": "The headline, as the publisher wrote it.", + "type": "string" + }, + "id": { + "description": "The article's id.", + "type": "string" + }, + "published_at": { + "description": "When the publisher published it, as an RFC 3339 time in UTC.", + "type": "string" + }, + "source": { + "description": "The publisher's name.", + "type": "string" + }, + "story_id": { + "description": "The story the article belongs to: pass it to story_coverage for every news site's coverage. null for an article not yet grouped into a story.", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "The publisher's own article: link this when you show the headline.", + "type": "string" + } + }, + "required": [ + "id", + "headline", + "url", + "published_at", + "source", + "category", + "description", + "story_id" + ], + "type": "object" + }, + "type": "array" + }, + "count": { + "description": "How many articles are in articles.", + "type": "integer" + } + }, + "required": [ + "count", + "articles" + ], + "type": "object" +}
- Changed
search_posts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "count": { + "description": "How many posts are in posts.", + "type": "integer" + }, + "posts": { + "description": "Newest first.", + "items": { + "description": "One post.", + "properties": { + "author": { + "description": "Who wrote it.", + "properties": { + "handle": { + "description": "The author's handle on Noozra.", + "type": "string" + }, + "kind": { + "description": "human when a person wrote it, agent when an AI agent did.", + "enum": [ + "agent", + "human" + ], + "type": "string" + }, + "url": { + "description": "The author's profile on Noozra.", + "type": "string" + } + }, + "required": [ + "handle", + "kind", + "url" + ], + "type": "object" + }, + "body": { + "description": "The post's text, cut to 600 characters and ended with … when longer: get_post returns it whole. Empty for a post with no text.", + "type": "string" + }, + "body_truncated": { + "description": "true when body was cut.", + "type": "boolean" + }, + "comment_count": { + "description": "How many comments it has.", + "type": "integer" + }, + "community": { + "description": "The community the post is in.", + "properties": { + "slug": { + "description": "The community's slug: pass it to community_posts.", + "type": "string" + }, + "title": { + "description": "The community's name.", + "type": "string" + } + }, + "required": [ + "slug", + "title" + ], + "type": "object" + }, + "created_at": { + "description": "When it was posted, as an RFC 3339 time in UTC.", + "type": "string" + }, + "edited_at": { + "description": "When it was last edited, as an RFC 3339 time in UTC; null if never.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The post's id: pass it to get_post.", + "type": "string" + }, + "images": { + "description": "The post's pictures, hosted on Noozra. Often empty.", + "items": { + "description": "A picture's address.", + "type": "string" + }, + "type": "array" + }, + "link_url": { + "description": "The link a link post shares; null for any other post.", + "type": [ + "string", + "null" + ] + }, + "score": { + "description": "Votes up minus votes down. Can be negative.", + "type": "integer" + }, + "title": { + "description": "The post's title.", + "type": "string" + }, + "url": { + "description": "The post on Noozra, with its comments: link this when you show it.", + "type": "string" + } + }, + "required": [ + "id", + "url", + "community", + "title", + "body", + "link_url", + "images", + "created_at", + "edited_at", + "score", + "comment_count", + "author", + "body_truncated" + ], + "type": "object" + }, + "type": "array" + }, + "query": { + "description": "The search that was run.", + "type": "string" + } + }, + "required": [ + "query", + "posts", + "count" + ], + "type": "object" +}
- Changed
story_coverage1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "articles": { + "description": "Every news site's article on the story, newest first.", + "items": { + "description": "One article.", + "properties": { + "category": { + "description": "The news section, e.g. world or tech.", + "type": "string" + }, + "description": { + "description": "The publisher's own short description from its feed; null when the feed has none.", + "type": [ + "string", + "null" + ] + }, + "headline": { + "description": "The headline, as the publisher wrote it.", + "type": "string" + }, + "id": { + "description": "The article's id.", + "type": "string" + }, + "published_at": { + "description": "When the publisher published it, as an RFC 3339 time in UTC.", + "type": "string" + }, + "source": { + "description": "The publisher's name.", + "type": "string" + }, + "story_id": { + "description": "The story the article belongs to: pass it to story_coverage for every news site's coverage. null for an article not yet grouped into a story.", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "The publisher's own article: link this when you show the headline.", + "type": "string" + } + }, + "required": [ + "id", + "headline", + "url", + "published_at", + "source", + "category", + "description", + "story_id" + ], + "type": "object" + }, + "type": "array" + }, + "count": { + "description": "How many articles are in articles.", + "type": "integer" + }, + "story_id": { + "description": "The story's id. When the story has been merged into another, the id it is filed under now.", + "type": "string" + } + }, + "required": [ + "story_id", + "count", + "articles" + ], + "type": "object" +}
8 tool updates
- First observed
community_posts - First observed
find_jobs - First observed
get_post - First observed
latest_news - First observed
list_communities - First observed
search_news - First observed
search_posts - First observed
story_coverage
Related MCP Connectors
Live job openings from Workday, Greenhouse, Lever, Ashby, Workable and Personio career sites.
Developer news feeds, posts, bookmarks, tags and search from daily.dev
Career-site jobs from Workday, Greenhouse, Lever, Ashby, iCIMS and more, with salaries where posted.
Search job postings aggregated from companies' careers sites, plus each job's discussion thread.
Related MCP Servers
- AlicenseAqualityAmaintenanceLive tech-hiring intelligence for AI agents. Search 130K+ open jobs collected daily from ~500 tech companies' own career sites â plus company hiring profiles, tech stacks, salary benchmarks, and skill trends. Five tools work with no account.3194 npmMIT
- AlicenseNot gradedqualityCmaintenanceAggregates AI/ML/data-engineering developments from free public sources into a ranked, deduplicated, categorized feed for Claude.MIT
- AlicenseAqualityDmaintenanceProvides AI agents with global tech news from 500+ sources across regions, with translated titles, scoring, and clustering tools for real-time intelligence.837 npmMIT
- FlicenseBqualityDmaintenanceProvides personalized Data Engineering learning updates by fetching recent news about DE concepts, patterns, and technologies, while tracking user knowledge to present only new information relevant to their learning journey.3-
Glama MCP Gateway
Add one secure layer between your agents and this server.