harpd-mcp
OfficialThis server lets AI agents query Harpd's open datasets over MCP stdio, with provenance on every result.
Search & browse the product catalog:
search_products(free-text/category/verification search),get_product(lookup by id, slug, or name), andget_products(paginated listing with filters on category, product type, verification, and rankPoints range).Read Rank boards:
get_rankingsreturns the overall/monthly/weekly boards with period metadata;get_category_rankingreads one of the 28 category boards;get_ranking_historycompares the three live snapshots side by side (and explicitly states there is no multi-month time series).Query Discovery Index coverage slices:
get_ai_agents(334 records),get_ai_tools(693), andget_developer_tools(1,918) return coverage lists with domains, descriptions, discovery sources, and observed_at timestamps — not rankings.Read research output:
get_researchreturns monthly research reports and the AI Market Index (27 category rows with product counts and rank-point share).Verify claims:
get_evidencequeries the Evidence Graph to check whether statements about Harpd data are supported, including claims Harpd explicitly does not make.Get sourced, citable answers: every response includes provenance (source, sourceUrl, dataset path, updatedAt, license, attribution, evidence) and disclaimers, so agents can quote where data came from and avoid treating rankPoints as quality.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@harpd-mcpShow me the AI Market Index data with provenance"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
harpd-mcp
Query Harpd's public AI product, ranking, research and evidence datasets directly from AI agents.
harpd-mcp is a Model Context Protocol server.
It gives an AI agent 11 tools for reading Harpd's open datasets — 1,122 AI
products, three Rank boards, 28 category boards, three Discovery Index slices,
the AI Market Index, published research and the Evidence Graph — over stdio,
with mandatory provenance on every single result.
git clone https://github.com/harpd-dev/harpd-mcp && cd harpd-mcp
npm install && npm run build
node examples/raw-stdio.mjs # zero-dependency proof it worksThe problem this solves
Harpd publishes its data openly at harpd.com/data and mirrors it to GitHub as raw JSON under CC BY 4.0. That is great for a developer who already knows the repository exists.
It is useless to an AI agent. An agent asked "which AI coding assistants are
listed, and can you back that up?" cannot curl a URL it has never heard of.
In practice the agent either says it has no data, or — far worse — answers from
training-data recall and states a confident, unsourced, possibly stale fact about
a product.
harpd-mcp closes that gap. It turns the datasets into callable tools, so the
agent retrieves the current record instead of remembering one.
Related MCP server: Lemma Oracle MCP Server
Why it exists
Three design decisions separate this from "wrap a JSON file in a tool":
1. Provenance is not optional. Every response — the envelope and every
record inside it — carries a provenance block with source, sourceUrl,
dataset (the file path), updatedAt, license, attribution and evidence.
There is no code path that returns a bare { name }. An agent that quotes Harpd
data can always say where it came from, when it was published, and under what
licence.
2. The two domain rules are encoded, not documented. They appear in the tool
descriptions the model actually reads, in the server instructions, and in a
machine-readable disclaimers array on every payload:
rankPointsare promotional placement bought with Credits on Harpd Rank. They are NOT an editorial quality score. Any tool that can order byrankPointssays so in its description and in its returned provenance.There is no multi-month ranking history in the dataset repository. Harpd publishes three live period-scoped snapshots.
get_ranking_historyreturns the periods that genuinely exist and states the limitation in the response itself. It will not fabricate a trend line.
3. Failure is graceful. A missing product or an unknown category returns a
structured found: false payload listing the valid options — not a crash and
not a stack trace in the model's context.
What data it uses
Read-only. Nothing is written back, and no API key is required.
Dataset file | Records | Served by |
| 1,122 |
|
| 1,122 |
|
| 1,122 |
|
| 1,122 |
|
| 28 |
|
| 27 |
|
| 334 |
|
| 693 |
|
| 1,918 |
|
| 5 |
|
| 5 claims |
|
| — | dataset metadata |
Record counts are read from the datasets themselves at runtime, not hard-coded.
Scope note. The product catalog is 1,122 records (
products.jsonand the three ranking boards). The research rows —ai-agent-index(334),ai-tools-index(693) anddeveloper-tools-index(1,918) — are separate coverage slices of the Harpd Discovery Index, not the product catalog. They are different datasets with their own sizes; only the catalog rows must equal the canonical product count. Full input/output reference:docs/tools.md.
How to run it
Requires Node.js >= 18.17.
git clone https://github.com/harpd-dev/harpd-mcp
cd harpd-mcp
npm install
npm run buildThen point any MCP stdio client at node /absolute/path/to/harpd-mcp/dist/index.js.
Environment variables
Variable | Default | Purpose |
|
| Where to read datasets from. Supports |
|
| On-disk cache TTL in milliseconds. |
|
| Cache location. |
The server fetches datasets from HARPD_DATA_BASE at runtime and caches them on
disk for the TTL. If a live fetch fails it falls back to the cached copy and adds
a warning to the response. A file:// base bypasses the cache entirely so local
runs are deterministic.
How to use the output
Every payload is one JSON text block shaped like this:
{
"tool": "search_products",
"found": true,
"query": { "query": "coding", "limit": 2 },
"pagination": { "total": 13, "count": 2, "offset": 0, "limit": 2, "hasMore": true, "nextOffset": 2 },
"results": [
{
"product": { "id": "github-copilot", "name": "GitHub Copilot", "rank": 11, "rankPoints": 0, "…": "…" },
"provenance": {
"source": "Harpd",
"sourceUrl": "https://raw.githubusercontent.com/…/data/products/products.json",
"dataset": "data/products/products.json",
"datasetId": "products",
"updatedAt": "2026-09-15T03:58:43.395Z",
"license": "CC BY 4.0",
"attribution": "Harpd (https://harpd.com)",
"evidence": {
"claimIds": [],
"methodologyUrl": "https://harpd.com/rank/methodology/",
"citation": "Harpd. \"products dataset.\" https://harpd.com/data/ Accessed: 2026-09-15. License: CC BY 4.0."
},
"notes": ["rankPoints are promotional placement bought with Credits on Harpd Rank. They are NOT an editorial quality score, …"]
}
}
],
"provenance": { "…": "same block, envelope level" },
"disclaimers": ["rankPoints are promotional placement bought with Credits on Harpd Rank. …"]
}Practical guidance:
Quote
provenance.sourceUrlandprovenance.updatedAtwhenever the agent repeats a figure. That is the difference between a sourced answer and a guess.Respect
disclaimers. They are returned precisely so they can be surfaced.Page with
pagination.nextOffset, not by guessing offsets.limitis capped at 200 by the input schema.Do not read
rankPointsas quality. If you need a non-purchasable signal, Harpd publishes one separately at harpd.com/data and says so in the Evidence Graph.
Tools
Tool | Purpose |
| Free-text / category search over the product catalog. |
| One product by id, slug or name. |
| Paginated catalog listing with filters. |
| A Rank board (overall / monthly / weekly) with its period metadata. |
| One of the 28 category boards, with board stats. |
| Compare the three board snapshots — and be told there is no time series. |
| AI-agent coverage slice (334 records). |
| AI-tools coverage slice (693 records). |
| Developer-tools coverage slice (1,918 records). |
| Monthly research reports + the AI Market Index. |
| The Evidence Graph: claims, chain, rules, and what Harpd does not claim. |
Client configuration
Verification status. This repository has verified the generic stdio client configurations below by actually running them (see
examples/—raw-stdio.mjsspeaks raw JSON-RPC with zero dependencies, and examples 1–5 use the official MCP SDK stdio client). The Claude Desktop, Cursor and VS Code sections are provided as configuration templates but are not verified in this repo — those applications were not available to launch and drive here, so no compatibility claim is made. Verify them yourself before relying on them.
Use absolute paths. Most clients do not inherit your shell PATH.
Generic stdio client — VERIFIED in this repo
Any client that can spawn a process and speak MCP over stdio:
{
"command": "node",
"args": ["/absolute/path/to/harpd-mcp/dist/index.js"],
"env": {
"HARPD_DATA_BASE": "https://raw.githubusercontent.com/harpd-dev/harpd-ai-datasets/main/"
}
}Verified two ways:
# 1. Raw JSON-RPC over stdio, zero dependencies (no MCP client library at all)
node examples/raw-stdio.mjs
# 2. Official MCP SDK stdio client
node examples/01-top-ai-coding-tools.mjsBoth were run against dist/index.js and returned real tool results. See the
Verification section for the exact output.
If you prefer the published package shape, the bin entry is harpd-mcp, so
once the package is published on npm the equivalent config is:
{ "command": "npx", "args": ["-y", "harpd-mcp"] }This package is not published to npm yet, so use the absolute-path form above for now. Publishing is a separate step and is not claimed here.
Claude Desktop — NOT VERIFIED in this repo
Config file: ~/Library/Application Support/Claude/claude_desktop_config.json
(macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows).
{
"mcpServers": {
"harpd": {
"command": "node",
"args": ["/absolute/path/to/harpd-mcp/dist/index.js"],
"env": {
"HARPD_DATA_BASE": "https://raw.githubusercontent.com/harpd-dev/harpd-ai-datasets/main/"
}
}
}
}Restart Claude Desktop after editing. The 11 tools appear under the tools icon.
Cursor — NOT VERIFIED in this repo
Project config .cursor/mcp.json, or global ~/.cursor/mcp.json:
{
"mcpServers": {
"harpd": {
"command": "node",
"args": ["/absolute/path/to/harpd-mcp/dist/index.js"]
}
}
}VS Code — NOT VERIFIED in this repo
Workspace config .vscode/mcp.json. Note that VS Code uses servers, not
mcpServers:
{
"servers": {
"harpd": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/harpd-mcp/dist/index.js"]
}
}
}Running offline
Point HARPD_DATA_BASE at a local checkout of the datasets. file:// bases
need a trailing slash:
git clone https://github.com/harpd-dev/harpd-ai-datasets
HARPD_DATA_BASE=file:///absolute/path/to/harpd-ai-datasets/ node dist/index.jsVerification
Everything below was run in this repository. The test suite runs against the real dataset files, never fixtures:
HARPD_DATA_BASE=file:///Users/shankou/harpd/harpd-ai-datasets/ npm test
# Test Files 2 passed (2)
# Tests 84 passed (84)Data Source
Harpd data portal: https://harpd.com/data/
Open dataset repository: https://github.com/harpd-dev/harpd-ai-datasets
Publisher: https://harpd.com/
License: CC BY 4.0 — attribution required
This server reads those files at runtime from
https://raw.githubusercontent.com/harpd-dev/harpd-ai-datasets/main/. It ships
no dataset copy of its own, so it cannot serve data that Harpd has not published.
Harpd Open AI Data Ecosystem
harpd-mcp is one client of the same open dataset that powers the rest of the
Harpd data surface. If you need the raw files, the CSV exports, the JSON Schemas
or the monthly snapshots, go straight to the source.
Harpd data portal — harpd.com/data — the canonical, citable entry point for every published dataset.
Harpd AI Datasets (GitHub) — github.com/harpd-dev/harpd-ai-datasets — raw JSON + CSV, JSON Schemas, validation scripts, starter templates and copy-paste examples in Python, JavaScript, curl, DuckDB, pandas and SQL.
Harpd Rank — harpd.com/rank — the boards these rankings come from, plus the published methodology.
Harpd Evidence — harpd.com/evidence — every published claim resolved to its evidence, dataset, methodology, source and timestamp.
Harpd research — harpd.com/research — the monthly index reports.
Harpd Discovery — harpd.com/discovery — the Product Discovery Index the agent / AI tools / developer tools slices are cut from.
harpd-mcp— this repository — the agent-facing MCP server for all of the above.
If you are building with the raw files rather than through an agent, use the datasets repository directly: it carries CSV exports, schemas and a daily sync workflow that this server does not duplicate.
Citation
If you use this server or the data behind it, cite Harpd:
@misc{harpd_data_2026,
title = {Harpd AI Datasets},
author = {{Harpd}},
year = {2026},
howpublished = {\url{https://harpd.com/data/}},
note = {Open datasets for AI products, rankings, research and evidence.
License: CC BY 4.0. Mirror: \url{https://github.com/harpd-dev/harpd-ai-datasets}}
}Plain text attribution string, as embedded in every dataset file:
Data from Harpd (https://harpd.com/)
If you cite this server specifically:
@software{harpd_mcp_2026,
title = {harpd-mcp: Model Context Protocol server for Harpd open AI datasets},
author = {{Harpd}},
year = {2026},
url = {https://github.com/harpd-dev/harpd-mcp},
note = {MIT licensed. Data licensed CC BY 4.0 by Harpd.}
}Machine-readable citation metadata is in CITATION.cff.
Development
npm run build # tsc -> dist/
npm run lint # eslint
npm test # vitest, against the real datasetsSee CONTRIBUTING.md and SECURITY.md.
License
Code: MIT — see
LICENSE.Data served by this server: CC BY 4.0, © Harpd. Attribution required. The MIT licence on this repository does not relicense the data.
Harpd is not affiliated with Anthropic, Cursor or Microsoft. MCP client names are used only to describe configuration formats.
Available Tools
11 toolsget_ai_agentsGet AI agents from the Harpd Discovery IndexARead-only
Return AI-agent products from the Harpd AI Agent Index (334 records, Discovery Index slice where category = "agents"). This is a COVERAGE list derived from the Harpd Product Discovery Index, NOT a ranking: records carry no rank and no rankPoints, and their order implies nothing about quality. Each record includes its observed_at timestamp, discovery source and profile URL. Use this to find AI agent products, their domains, one-line titles and where they were discovered. Some records also appear on the Harpd Rank board (on_rank_board). Every record carries full provenance (source, dataset path, sourceUrl, updatedAt, license, attribution).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1-200, default 20). | |
| query | No | Free-text query matched against name, domain, title and description. | |
| domain | No | Exact or suffix domain match, e.g. "uneed.best". | |
| offset | No | Number of records to skip before the page starts. Must be >= 0. | |
| category | No | Exact Discovery Index category, e.g. "agents", "developer", "ai-media". | |
| onRankBoard | No | Filter on whether the record also appears on the Harpd Rank board. | |
| minConfidence | No | Only records whose category_confidence is >= this value (0-1). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and open-world, but the description goes well beyond that: it discloses the coverage-list nature, the absence of rank/rankPoints, the meaninglessness of record order, the inclusion of observed_at and discovery source, and full provenance fields. This gives an agent crucial understanding of what the data does and does not represent.
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?
The description is longer than minimal, but each sentence adds value: scope, coverage-not-ranking caveat, record contents, usage direction, on_rank_board nuance, and provenance. It is front-loaded with the core purpose and does not contain filler. It could be tightened by removing slight redundancy around 'Discovery Index,' but overall it is structured effectively.
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?
Given seven optional parameters, no output schema, and many sibling tools, the description does a solid job by explaining record contents and the crucial non-ranking semantics. It lacks explicit differentiation from siblings like get_ai_tools or search_products, and it does not fully enumerate all output fields, but the essential information for correct invocation is present.
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 fully documents all seven optional parameters. The description adds context around the fixed category ('agents') and the on_rank_board field, but it does not add meaning beyond what the schema provides. Baseline 3 is appropriate because the schema carries the parameter documentation burden.
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 specific verb and resource: 'Return AI-agent products from the Harpd AI Agent Index.' It precisely scopes the tool to the 'agents' category slice and explicitly separates it from ranking tools by stating it is 'NOT a ranking.' This makes it easy for an agent to distinguish from siblings like get_rankings or get_category_ranking.
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?
The description gives clear usage context: 'Use this to find AI agent products, their domains, one-line titles and where they were discovered.' It also implicitly tells when not to use it for ranking purposes by emphasizing there is no rank or rankPoints. However, it does not explicitly name alternative tools for ranking or for non-agent products, so some inference remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ai_toolsGet AI tools from the Harpd Discovery IndexARead-only
Return AI tooling products from the Harpd AI Tools Index (693 records, Discovery Index slice where category is "agents" or "ai-media"). This is a COVERAGE list derived from the Harpd Product Discovery Index, NOT a ranking: records carry no rank and no rankPoints, and their order implies nothing about quality. Each record includes its observed_at timestamp, discovery source and profile URL. Use this to retrieve the current AI tools dataset: name, domain, URL, category, title, description, discovery source and observation timestamp. Every record carries full provenance (source, dataset path, sourceUrl, updatedAt, license, attribution).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1-200, default 20). | |
| query | No | Free-text query matched against name, domain, title and description. | |
| domain | No | Exact or suffix domain match, e.g. "uneed.best". | |
| offset | No | Number of records to skip before the page starts. Must be >= 0. | |
| category | No | Exact Discovery Index category, e.g. "agents", "developer", "ai-media". | |
| onRankBoard | No | Filter on whether the record also appears on the Harpd Rank board. | |
| minConfidence | No | Only records whose category_confidence is >= this value (0-1). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and open-world behavior, and the description adds meaningful beyond-annotation context: this is a coverage list, not a ranking, records carry no rank or rankPoints, and order implies nothing about quality. It also discloses provenance behavior and returned fields.
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?
The description is moderately sized and front-loads the core purpose and scope before caveats. It is slightly repetitive in enumerating record fields and provenance twice, but every sentence contributes useful information.
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 read-only list tool with strong annotations and fully documented parameters, the description covers the dataset size, category scope, non-ranking semantics, returned fields, and provenance. An agent has enough context to call it correctly without an 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?
Schema description coverage is 100%, so the schema fully documents all 7 parameters. The description does not add parameter-level detail, so the baseline of 3 applies; it usefully confirms the record fields but not parameter semantics.
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 ('Return') and resource ('AI tooling products from the Harpd AI Tools Index') and precisely scopes the slice by category. It also explicitly differentiates this from a ranking, which distinguishes it from sibling ranking tools.
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?
Clearly says 'Use this to retrieve the current AI tools dataset' and describes the intended data slice. It does not explicitly name alternatives or state when not to use it, but the context is strong enough for an agent to choose appropriately among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_category_rankingGet a Harpd category boardARead-only
Read one of the 28 published Harpd Rank category boards: the board metadata (product counts, state, board URL) plus the products listed in that category. CRITICAL: rankPoints are promotional placement bought with Credits on Harpd Rank, NOT an editorial quality score. A category board being "topRankOpen" or a product having high rankPoints says nothing about product quality. An unknown category returns a structured found:false result listing the valid slugs, not an error. Every record carries full provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Ordering of the returned records. "rank" = board position ascending. "rankPoints" = descending by promotional placement, which is NOT a quality ordering. "name" = alphabetical. | rank |
| limit | No | Maximum number of records to return (1-200, default 20). | |
| offset | No | Number of records to skip before the page starts. Must be >= 0. | |
| category | Yes | Harpd category slug, e.g. "developer", "agents", "ai-media", "seo". Must be one of the 28 published category boards. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds substantial behavioral context beyond annotations: the CRITICAL warning that rankPoints are promotional placement, not quality scores; the structured found:false result for unknown categories instead of an error; and the promise that every record carries full provenance. This is exactly the kind of non-obvious behavior an agent needs to know.
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?
The description is compact and front-loaded: the first sentence states the core function, and the critical warning about rankPoints is placed prominently. The provenance sentence is slightly redundant with the openWorldHint annotation but adds useful context. Every sentence earns its place, though the warning could be slightly tightened.
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 read-only list tool with 100% schema coverage and no output schema, the description covers the essential behavior: what is returned, the critical semantic warning, and the error behavior for unknown categories. It doesn't describe pagination details (though limit/offset are in the schema) or the exact shape of the board metadata, but those are either in the schema or not required for correct invocation. A 4 is fair because the description is complete enough for an agent to call it correctly without surprises.
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 four parameters (category, sort, limit, offset) with types, defaults, and constraints. The description adds the semantic warning that sort=rankPoints is NOT a quality ordering, which is valuable context beyond the schema. However, it doesn't add much about the category parameter beyond what the schema already says, so baseline 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 verb ('Read'), a specific resource ('one of the 28 published Harpd Rank category boards'), and exactly what is returned (board metadata plus listed products). It also distinguishes itself from siblings by naming the resource type (category board) and the fixed set of 28 boards, which is enough to tell it apart from get_product, search_products, and get_rankings.
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?
The description gives clear context for when to use this tool: to read a category board and its products. It does not explicitly name sibling alternatives or say 'use search_products instead when...', but it does specify the scope (one of 28 published boards) and the behavior for unknown categories, which implies when it is appropriate. A small gap: no explicit exclusion of when to use get_rankings or get_ranking_history instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_developer_toolsGet developer tools from the Harpd Discovery IndexARead-only
Return developer-tool products from the Harpd Developer Tools Index (1,918 records, Discovery Index slice where category = "developer"). This is a COVERAGE list derived from the Harpd Product Discovery Index, NOT a ranking: records carry no rank and no rankPoints, and their order implies nothing about quality. Each record includes its observed_at timestamp, discovery source and profile URL. Use this to find developer tools, SDKs, infra and dev platforms by name, domain or description. Every record carries full provenance (source, dataset path, sourceUrl, updatedAt, license, attribution).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1-200, default 20). | |
| query | No | Free-text query matched against name, domain, title and description. | |
| domain | No | Exact or suffix domain match, e.g. "uneed.best". | |
| offset | No | Number of records to skip before the page starts. Must be >= 0. | |
| category | No | Exact Discovery Index category, e.g. "agents", "developer", "ai-media". | |
| onRankBoard | No | Filter on whether the record also appears on the Harpd Rank board. | |
| minConfidence | No | Only records whose category_confidence is >= this value (0-1). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses key behaviors: this is a coverage list rather than a ranking, order implies nothing about quality, and every record includes observed_at, discovery source, profile URL, and full provenance. This gives the agent useful expectations about data completeness and limitations without contradicting 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?
The description is dense but efficient: it front-loads the resource and scope, then adds the crucial non-ranking caveat, a concrete usage line, and provenance details. Every sentence earns its place, with 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?
For a read-only list tool with 7 schema-documented parameters and no output schema, the description provides the missing return-value context: record contents, provenance, and the non-ranking nature of the data. Together with the schema and annotations, this is sufficient for an agent to select and invoke the tool 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?
The input schema already documents all 7 parameters with 100% coverage, so the baseline is 3. The description adds minor context by mentioning matching against name, domain, or description and confirming the developer category, but it does not materially enrich parameter semantics beyond the schema.
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 specific verb and resource: 'Return developer-tool products from the Harpd Developer Tools Index.' It further pins the exact slice ('Discovery Index slice where category = "developer"') and explicitly separates this from ranking tools by stating it is NOT a ranking. This clearly distinguishes it from sibling tools like get_rankings or get_ai_tools.
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?
The description gives explicit use guidance: 'Use this to find developer tools, SDKs, infra and dev platforms by name, domain or description.' It also implicitly warns against using it for ranked comparisons by saying records 'carry no rank and no rankPoints.' It does not name alternative sibling tools or state when not to use it, so it falls just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_evidenceGet Harpd evidence claims for a dataset or productARead-only
Query the Harpd Evidence Graph: every published Harpd claim resolved to its evidence, dataset, methodology, source and data timestamp, including the claims Harpd explicitly does NOT make. Use this to check whether a statement about Harpd data is actually supported before repeating it. IMPORTANT: the graph itself records that rankPoints are promotional placement bought with Credits, and that "a higher-ranked product is a better product" is NOT a supported claim. rankPoints are NOT an editorial quality score. Claims that fail the evidence chain are returned with their violations rather than hidden. Every record carries full provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1-200, default 20). | |
| query | No | Free-text query matched against claim text, claim dataset id, source name/url and methodology URL. | |
| offset | No | Number of records to skip before the page starts. Must be >= 0. | |
| claimId | No | Exact claim id from the Harpd Evidence Graph, e.g. "pricing:list-prices-verified". | |
| claimType | No | Only claims of this evidence type. | |
| datasetId | No | Only claims that resolve to this Harpd dataset id, e.g. "rank", "products". | |
| productName | No | Product name (or part of it). Resolves the product in the Harpd catalog and returns the evidence that actually covers it, plus the claims Harpd explicitly does NOT make about it. | |
| includeGraph | No | Also return the Evidence Graph nodes and edges for the matched claims. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, openWorldHint), the description discloses meaningful behaviors: it returns claims that fail the evidence chain with their violations rather than hiding them, includes claims Harpd explicitly does not make, and records that rankPoints are promotional placement bought with Credits, not an editorial quality score. This adds rich context beyond the structured 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?
The description is front-loaded with the core purpose, followed by usage guidance and important behavioral caveats. Every sentence earns its place: purpose, use case, rankPoints clarification, violation handling, and provenance. The length is justified by the tool's complexity and the need to prevent misuse.
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?
Despite having no output schema, the description explains what is returned (evidence, dataset, methodology, source, timestamp, provenance, violations, non-claims) and clarifies critical domain facts. Combined with the comprehensive input schema and annotations, an agent has enough context to invoke this tool correctly and interpret results.
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 parameters are already fully documented. The description does not add parameter-specific semantics (e.g., how query or productName interact with the evidence graph), but it does add domain context like the rankPoints caveat. Baseline 3 is appropriate because the schema carries the parameter details.
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 action ('Query the Harpd Evidence Graph') with a clear resource and scope: every published claim resolved to evidence, dataset, methodology, source, and timestamp, including claims not made. This distinguishes it from sibling tools like get_product or get_rankings, which focus on products or rankings rather than evidence-backed claims.
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 on when to use the tool: 'Use this to check whether a statement about Harpd data is actually supported before repeating it.' It does not explicitly name alternatives or exclusion conditions, but the usage scenario is well defined and implies this is the evidence-verification tool among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productGet one Harpd AI productARead-only
Look up a single product in the Harpd open product catalog by id, slug or name. Returns the product record plus mandatory provenance (source, dataset path, sourceUrl, updatedAt, license, attribution, evidence links). A product that does not exist returns a structured found:false result rather than an error. NOTE: rankPoints are promotional placement bought with Credits, NOT an editorial quality score.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Exact Harpd product id, e.g. "imgkit-86d32f3e". | |
| name | No | Product name. Matched exactly first, then case-insensitively, then as a substring. | |
| slug | No | Exact Harpd product slug. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already provided, the description adds useful non-obvious behavior: missing products return a structured found:false result rather than an error, and rankPoints are explicitly de-mystified as promotional, not editorial quality. These disclosures go beyond annotations and meaningfully shape how an agent interprets 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?
The description is three sentences with no filler: it states the primary use, the return contents, the not-found behavior, and a critical note about rankPoints. All sentences earn their place, though the provenance list is slightly dense and could be simplified.
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?
The description covers return fields, not-found behavior, and rankPoints, but it never states that at least one of id/slug/name must be supplied (the schema marks all as optional, yet the tool is unusable with zero parameters). This is a critical operational gap. The description also omits match semantics for 'name', though those appear in the schema, so the gap is partially mitigated.
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?
The schema has 100% description coverage for all three parameters, and the tool description only restates that lookup is by id, slug, or name. It adds no parameter-specific meaning beyond what the schema already documents, 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 verb ('Look up') and a specific resource ('a single product... by id, slug or name'), which clearly differentiates it from siblings like search_products and get_products. The title and description both emphasize the singular-product scope, leaving no ambiguity about what the tool does.
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?
The description implies the tool is for single-product lookups by identifier, but it never explicitly says when to choose this over search_products or get_products. There are no exclusions or alternative routing instructions, so the agent must infer from the sibling names rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productsList Harpd AI products (paginated)ARead-only
Page through the full Harpd open product catalog (1,122 records) with filters on category, verification state, product type and rankPoints range. Use this to enumerate or bulk-export products; use search_products for free-text lookup. IMPORTANT: rankPoints are promotional placement bought with Credits on Harpd Rank, NOT an editorial quality score. Sorting by "rankPoints" orders by promotional placement, not by merit. Page size is capped at 200. Every record carries full provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Ordering of the returned records. "rank" = board position ascending. "rankPoints" = descending by promotional placement, which is NOT a quality ordering. "name" = alphabetical. | rank |
| limit | No | Maximum number of records to return (1-200, default 20). | |
| offset | No | Number of records to skip before the page starts. Must be >= 0. | |
| category | No | Exact Harpd category slug. | |
| verified | No | Filter by Harpd verification state. | |
| productType | No | Substring match against the free-text productType field, e.g. "Design platform". | |
| maxRankPoints | No | Only products with rankPoints <= this value. | |
| minRankPoints | No | Only products with rankPoints >= this value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnlyHint and openWorldHint, but the description adds substantial extra behavioral context: rankPoints are promotional placement bought with Credits, not an editorial quality score, sorting by rankPoints is a non-merit ordering, page size is capped at 200, and every record carries full provenance. This meaningfully exceeds the annotation coverage.
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?
The description is compact and every sentence earns its place: primary purpose, usage routing, the critical rankPoints caveat, pagination cap, and provenance note. The most decision-relevant information (what it is and when to use it) is front-loaded.
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?
Despite having 8 parameters and no output schema, the description gives an agent everything needed to invoke the tool correctly: scope, filters, pagination behavior, sorting semantics, and the distinction from search_products. The provenance note partially compensates for the absent output schema by setting expectations about record completeness.
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. The description adds value by warning that sorting by 'rankPoints' orders by promotional placement rather than merit, which directly enriches the most subtle parameter. It also summarizes the filter dimensions (category, verification, product type, rankPoints range), but the schema already covers those clearly.
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 names a specific verb ('Page through') and resource ('full Harpd open product catalog'), and explicitly distinguishes itself from search_products as the enumeration/bulk-export path. This leaves no ambiguity about what the tool does or how it differs from its closest sibling.
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?
The description states when to use this tool ('Use this to enumerate or bulk-export products') and explicitly routes users away from it for free-text lookup ('use search_products for free-text lookup'). This provides clear selection guidance against the main alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ranking_historyCompare Harpd board snapshots (NOT a time series)ARead-only
Compare the three published Harpd Rank board snapshots (overall / monthly / weekly) for one product, or side by side at board level. HONEST SCOPE WARNING: this repository publishes three LIVE period-scoped snapshots, each covering its current window. It does NOT contain a multi-month historical time series, so this tool cannot and will not return month-over-month trends. It returns the periods the datasets really expose plus an explicit statement of the limitation. CRITICAL: rankPoints are promotional placement bought with Credits on Harpd Rank, NOT an editorial quality score. Movement between boards reflects promotional placement, not a change in product quality.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Also return the top N rows of each board so boards can be compared side by side (0-50, default 0 = off). | |
| boards | No | Which published boards to include. Defaults to all three. | |
| productId | No | Harpd product id to locate across boards. | |
| productSlug | No | Harpd product slug to locate across boards. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and open-world, and the description adds substantial behavioral context: only three live period-scoped snapshots exist, no historical time series is available, and rankPoints represent purchased promotional placement rather than quality. This materially prevents misinterpretation of 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?
The description is well-structured and front-loaded with the core purpose, with clearly labeled warnings for the most important caveats. There is minor redundancy in repeating the 'not a time series' point in both title and description, but the emphasis serves a real safety purpose.
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 read-only tool with no output schema, the description explains what the tool can and cannot return: exposed periods plus an explicit limitation statement. It also clarifies the meaning of rankPoints. It could describe the exact result layout or how productId versus productSlug is resolved, but the essential calling context is covered.
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 explains each parameter. The description reinforces the board comparison context but does not add per-parameter meaning beyond what the schema provides, fitting the baseline for high schema coverage.
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 verb 'Compare' plus the direct object 'the three published Harpd Rank board snapshots (overall / monthly / weekly)' specifies exactly what the tool does. The title's '(NOT a time series)' and the discussion of product-level versus board-level comparison distinguish it from ranking/history siblings.
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 states when to use the tool (comparing snapshots for one product or side by side at board level) and is emphatic about when not to use it (month-over-month trends, because no multi-month time series exists). It does not name an alternative sibling tool, but the exclusion is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rankingsGet a Harpd Rank boardARead-only
Read one of the three published Harpd Rank boards (overall / monthly / weekly) with its period metadata. CRITICAL: rankPoints are promotional placement bought with Credits on Harpd Rank. They are NOT an editorial quality score, and a higher rankPoints value does NOT mean a better product. Ordering by "rankPoints" orders by promotional placement. Ordering by "rank" follows the published board position, which is also derived from promotional placement. The board is a live snapshot for its period, not a historical time series. Every record carries full provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Ordering of the returned records. "rank" = board position ascending. "rankPoints" = descending by promotional placement, which is NOT a quality ordering. "name" = alphabetical. | rank |
| board | No | Which published Harpd Rank board to read: "overall" (all-time board, scoped to the current month), "monthly" (current-month window) or "weekly" (current-week window). | overall |
| limit | No | Maximum number of records to return (1-200, default 20). | |
| offset | No | Number of records to skip before the page starts. Must be >= 0. | |
| category | No | Restrict to one exact Harpd category slug. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint. The description goes well beyond by explaining that rankPoints are promotional placement, not quality scores, and that ordering by rank is also derived from promotional placement. It also discloses the live-snapshot nature, which complements the openWorldHint. This is critical behavioral context that prevents misinterpretation of 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?
The description is well-structured, leading with the core purpose, then the critical caveat about rankPoints, then the snapshot nature. Each sentence earns its place, and the CRITICAL flag draws attention to the most important trap. It is appropriately sized for the complexity of the tool.
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?
The description covers the key pitfalls and usage constraints, but it does not describe the return structure or what 'period metadata' entails, which could be useful given there is no output schema. However, the critical semantics about sorting and board types are well covered, and the lack of output schema is offset by the clarity of the description. Minor gap, but overall complete for safe invocation.
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. The description adds significant value for the 'sort' parameter by warning that 'rankPoints' is not a quality ordering and that 'rank' also reflects promotional placement. This is crucial beyond the schema's terse description. It does not add details for limit/offset/category, but those are adequately described in the schema.
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 clearly states the tool reads one of three published Harpd Rank boards and returns period metadata. It uses a specific verb ('Read') and resource ('Harpd Rank boards'), and distinguishes itself from historical time-series tools by emphasizing it is a live snapshot. This differentiates it from siblings like get_ranking_history without naming them explicitly.
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?
The description provides context on when to use the tool: reading published boards for a given period, not historical data. It explicitly states the board is not a historical time series, implying an alternative exists, but it does not name get_ranking_history or get_category_ranking. The CRITICAL note about rankPoints also guides appropriate use, but there is no explicit when-not-to-use list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_researchGet Harpd research reports and the AI market indexARead-only
Read Harpd research output: the published monthly research reports (5 records, one per family/month) and the AI Market Index (27 category rows with product counts, product share and rank-point share). IMPORTANT: pointsShare is a share of rankPoints, and rankPoints are promotional placement bought with Credits on Harpd Rank. They are NOT an editorial quality score. pointsShare is not a share of quality or of market merit. Reports exist only for closed months with enough ranked products in the family scope. Every record carries full provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1-200, default 20). | |
| family | No | Filter reports by research family, e.g. "ai-agent-index", "ai-market-index", "ai-tools-index", "developer-tools-index", "ai-tools-trends". | |
| offset | No | Number of records to skip before the page starts. Must be >= 0. | |
| section | No | "reports" = the published monthly research reports; "market-index" = category-level product counts and rank-point distribution; "all" = both. | reports |
| category | No | Filter the market index by exact category slug. | |
| monthKey | No | Filter reports by month key, e.g. "2026-08". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description supplies rich interpretive context: pointsShare is a share of promotional rankPoints bought with Credits, explicitly NOT an editorial quality or market-merit score. It also discloses data-availability constraints (reports exist only for closed months with enough ranked products) and asserts full provenance on every record, which materially prevents misuse.
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?
The description is front-loaded with the resource scope and then delivers two high-value caveats (pointsShare semantics and closed-month availability) that prevent real misinterpretation. It is slightly longer than strictly necessary - the quality-score point is restated twice ('NOT an editorial quality score' and 'not a share of quality or of market merit') - which keeps it from a perfect score.
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 no output schema, the description carries the burden of explaining return values, and it does so at a useful level: record counts, row semantics, the meaning of share fields, and availability constraints. Combined with the readOnly/openWorld annotations and fully documented parameters, an agent has what it needs to call this correctly; only per-field detail of the report records is left unspecified.
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 input schema already documents all six parameters, and the description adds no parameter-specific guidance beyond it. The 'IMPORTANT' caveat clarifies the semantic meaning of an output field (pointsShare) rather than any input parameter, so the description correctly holds at the high-coverage baseline of 3.
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 specific verb and resource ('Read Harpd research output') and enumerates exactly what that includes: 5 monthly report records and a 27-row AI Market Index with product counts, product share, and rank-point share. This concrete scope distinguishes it from the product/ranking sibling tools (get_rankings, get_product, get_category_ranking) without needing to inspect any 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?
The description makes the tool's domain clear ('research output... published monthly research reports... market index'), so an agent can infer it is for Harpd's published analysis rather than raw ranking or product data. However, it never names an alternative sibling (e.g., get_rankings or get_evidence) or states when not to use this tool, leaving the guidance implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_productsSearch Harpd AI productsARead-only
Search the Harpd open product catalog (1,122 AI products) by free text, category and verification state. Returns each product with its board position (rank) and its rankPoints. IMPORTANT: rankPoints are promotional placement bought with Credits on Harpd Rank, NOT an editorial quality score. Ordering by rankPoints orders by promotional placement, not by merit. Every record carries full provenance (source, dataset path, updatedAt, license, attribution, evidence).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Ordering. "rank" = board position ascending. "rankPoints" = descending by promotional placement bought with Credits, which is NOT a quality ordering. "relevance" only applies when `query` is set. | relevance |
| limit | No | Maximum number of records to return (1-200, default 20). | |
| query | No | Free-text query matched against product name, slug, description, product type, website and category name. | |
| offset | No | Number of records to skip before the page starts. Must be >= 0. | |
| category | No | Exact Harpd category slug, e.g. "developer", "agents", "ai-media". | |
| verified | No | Filter by Harpd verification state. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses the non-obvious behavior that rankPoints are paid promotional placement, not editorial quality, which prevents a serious misinterpretation. This adds meaningful context beyond the readOnlyHint/openWorldHint annotations, though it does not address rate limits or exact response formatting.
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?
The description is well-structured and front-loaded with the main action and key output. The rankPoints warning is valuable but partially redundant with the sort parameter description, making it slightly longer than necessary.
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 tool with no output schema, the description covers the important operational context: catalog size, available filters, ordering semantics, returned fields (rank, rankPoints), and full provenance. This is enough for an agent to call and interpret results 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%, so the schema already documents sort, limit, query, offset, category, and verified clearly. The description mostly repeats the rankPoints warning and lists search dimensions, adding little meaning beyond what the schema provides.
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 names a specific verb ('Search'), a specific resource ('the Harpd open product catalog'), and the main search dimensions ('free text, category and verification state'). It also states the return value includes rank and rankPoints, making it distinct from the sibling get_* tools.
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?
The description makes the use case clear: search a broad catalog by free text, category, or verification state, rather than fetching a single product. It does not explicitly say when not to use it or name alternatives such as get_product or get_rankings, so it falls short of full routing guidance.
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.
11 tool updates
v0.1.0- First observed
get_ai_agents - First observed
get_ai_tools - First observed
get_category_ranking - First observed
get_developer_tools - First observed
get_evidence - First observed
get_product - First observed
get_products - First observed
get_ranking_history - First observed
get_rankings - First observed
get_research - First observed
search_products
TDQS
Scored across 11 tools
The catalog tools are clearly separated by mode (single lookup, free-text search, paged enumeration), and ranking, discovery-index, research, and evidence tools target distinct resources. The main overlap is between get_ai_agents and get_ai_tools, since one is a subset of the other's filter scope, but the descriptions do enough to clarify their different index purposes.
The naming pattern is mostly predictable: a get_ prefix followed by a domain noun, with search_products as the one clear exception. There is also some singular/plural inconsistency (get_product vs get_products, get_rankings vs get_category_ranking), but the overall convention remains readable and navigable.
Eleven tools is well within the ideal range and each tool maps to a meaningful data-access need: product lookup/search/enumeration, board reads, history comparison, three discovery-index slices, research, and evidence checking. None of the tools feel redundant or superfluous for the server's stated purpose.
The server covers the core read-only workflows for the Harpd domain: retrieving products, searching and enumerating them, reading rank boards, comparing snapshots, pulling discovery-index slices, and accessing research and evidence. Minor gaps include the lack of a dedicated category-list endpoint and the absence of search/detail operations within the discovery-index slices, but these are workable.
Maintenance
Related MCP Connectors
Give your agent web search and authoritative datasets: S&P Global, FRED, OECD, SimilarWeb & more.
Query Klaaro datasets, documents, and extracted records from any agent.
Direct access to 60+ scraping and search tools. Extract structured data from Google (Search, Maps, Trends), Amazon, Airbnb, Social Media, and any web page directly into your AI agent.
Real-time fact-check, citation verification, and source-freshness for AI agents.
Related MCP Servers
- AlicenseBqualityCmaintenanceQuery 20 structured datasets from AI agents — healthcare providers (9M NPI records), SEC EDGAR filings, PACER federal courts, USPTO patents and trademarks, OFAC sanctions screening, crypto whale wallets, DeFi liquidation signals, Polymarket smart money, economic indicators (FRED/BLS), federal contracts, NOAA weather, and OTC shell risk scoring. Pay per query, no subscriptions751MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to query cryptographically verified facts with zero-knowledge proofs, selective disclosure, and tamper-evident provenance.192 npm1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to query self-hosted knowledge bases through hybrid retrieval and list available datasets, providing grounded, retrieval-augmented answers.3 npmApache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to query a curated, cited knowledge graph on testing, benchmarking, and auditing autonomous agents, returning claims with sources, confidence values, and evidence tiers through eight read-only tools over a remote streamable-HTTP endpoint with no authentication required.CC BY-4.0