HODDS
REMOTE · HODDS.AI
Find software, SaaS and APIs for a need in a sourced catalogue organised by business process.
Available components
Last scanned (6 hours ago)
Scores higher than 53% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Search and Retrieval
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (unwatch_need). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability64
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 3274 tokens (~155/item across 21 items; 21 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management33
- Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage85
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 47% of tool parameters carry a description.Partial
- Structured output schemas are declared (90% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 22 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.
- 30 Oct 26 0
- Tool “cancel_plan” rewrote its description, which is the text the model reads security
- Tool “get_plan” rewrote its description, which is the text the model reads security
- Tool “watch_need” rewrote its description, which is the text the model reads security
- Server version: 0.6.0 → 0.7.0 functional
- “watch_need” added an optional parameter “target” cosmetic
- 29 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “cancel_plan” rewrote its description, which is the text the model reads security
- Tool “get_plan” rewrote its description, which is the text the model reads security
- Tool “watch_need” rewrote its description, which is the text the model reads security
- Server version: 0.5.0 → 0.6.0 functional
- 28 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Oct 26 0
- Tool “cancel_plan” rewrote its description, which is the text the model reads security
- Tool “get_plan” rewrote its description, which is the text the model reads security
- Tool coverage: 100% → 90% ▼ functional
- Schema quality: 2826 → 3188 ▼ functional
- Tool coverage: 59% → 48% ▼ functional
- Stability: unverified → 0.03 ▲ functional
- Server version: 0.4.0 → 0.5.0 functional
- New tool “read_choice” functional
- New tool “watch_choice” functional
- 26 Oct 26 64
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://hodds.ai/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=hodds.ai | CN=WE1,O=Google Trust Services,C=US | 27 Sept 2026 | 26 Dec 2026 | ECDSA 256 | ECDSA-SHA256 | 52990385e298dde10e5e4a802bbb8807 |
| SANs: hodds.ai, *.hodds.ai | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of hodds.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 1814, 3799 | 8, 8 | Verified |
| hodds.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=15552000; includeSubDomains |
| content-security-policy | default-src 'none'; frame-ancestors 'none' |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | no-referrer |
| permissions-policy | camera=(), microphone=(), geolocation=(), payment=() |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://hodds.ai/mcp | Verified | 200 | |
| http (plaintext) | http://hodds.ai/mcp | HTTPS enforced | 301 | https://hodds.ai/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
ack_alerts Acknowledge alerts ~132
Acknowledges alerts of one watch (alert_ids, or all: true for every alert of this watch); the only call that empties the pending delivery. Returns the number acknowledged and the number remaining for the organisation; a replay changes nothing. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_ids | array | – | Alert ids (a_...). |
| all | boolean | – | true: every alert of this watch. |
| watch_id | string | yes | Watch id returned by watch_need or list_watches (w_...). |
| Name | Type | Req | Description |
|---|---|---|---|
| acked | integer | yes | Alerts acknowledged by this call. |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| remaining | integer | yes | Unacknowledged alerts left for the organisation. |
| summary | string | – | One sentence in English, or in French when the request was in French. |
No examples provided.
cancel_creator_plan Stop the creator plan ~69
Stops the subscription at the end of the paid period. Listings, claims, declarations and ranking are unchanged; the coarse demand table stays free. Contract 0.3.1. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| ends_on | string | yes | – |
| listings | – | yes | – |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| plan | – | yes | – |
| summary | string | yes | One sentence in English, or in French when the request was in French (or in the language of the organisation). |
| then | – | yes | – |
No examples provided.
cancel_plan Stop the My ways plan ~88
Stops the subscription at period end; new paid watches are refused immediately. Then paid watches close and remain readable 30 days. No renewal minimum. Agent tokens and legacy free rights are unchanged. Without a paid plan the tool answers not_paid. Contract 0.7.0. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| ends_on | string | yes | – |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| plan | – | yes | – |
| readable_until | string | yes | – |
| summary | string | yes | One English/French sentence, per request or organisation language. |
| then | – | yes | – |
No examples provided.
compare_solutions Compare solutions for a need ~156
Compare 2–3 catalogue IDs by required capabilities, offer, context and dated sources. Unknown/stale/conflict stay explicit; unknown price is never zero. Discover IDs at /api/capabilities and details at /api/solutions/{id}/specification. Costs require all assumptions. Large result: repeat arguments with view; restart on 409. Public read, no billing/business writes; one call per POST.
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| cost_scenario | – | – | – |
| criteria | array | – | – |
| locale | string | – | – |
| priority | – | – | – |
| priority_required | boolean | – | – |
| requirements | array | – | – |
| solution_ids | array | yes | – |
| view | object | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
find_comparable_solutions Find alternatives for a priority ~152
Find alternatives by required priority, optionally relative to one solution. IDs/context: /api/capabilities. A match satisfies every requirement in one configuration. Evaluates the whole pilot before limit, separating match/unresolved/mismatch and stating catalogue coverage, not market coverage. Large result: repeat arguments with view; restart on 409. Public read, no billing/business writes; one call per POST.
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| cost_scenario | – | – | – |
| criteria | array | – | – |
| limit | integer | – | – |
| locale | string | – | – |
| priority | object | yes | – |
| reference_id | – | – | – |
| requirements | array | – | – |
| view | object | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
get_creator_plan Read the creator plan ~103
Returns the demand data subscription of the organisation of the token: plan NONE or SUBSCRIBED, subscribed processes, pending removals, the coming invoice, payment provider and invoices. €10 excl. VAT per process per month, invoiced by VORAN, paid through Stripe; no effect on ranking. Contract 0.3.1. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| billing | object|null | yes | – |
| currency | – | yes | – |
| ends_on | string|null | yes | – |
| invoiced_by | – | yes | – |
| invoices | array | yes | – |
| next_invoice | object|null | yes | – |
| payment | object|null | yes | – |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| pending_removals | array | yes | – |
| plan | – | yes | – |
| price_per_process_month | – | yes | – |
| processes | array | yes | – |
| ranking_effect | – | yes | – |
| since | string|null | yes | – |
| summary | string | yes | One sentence in English, or in French when the request was in French (or in the language of the organisation). |
| unit | – | yes | – |
No examples provided.
get_plan Read the My ways plan ~204
Returns the plan of the organisation of the token: FREE, PAID, PAST_DUE, ENDING or ENDED; watched solutions billed in the current Stripe period, offer_version, invoice and payment proof. initial_basket, when present, gives the account's selected needs, exact upfront quote and activation status; its destination is for a human, not agent payment. prepaid-v1: €2 excl. VAT at the start of each monthly period covers the first 4 counted watches; initial basket extras: €0.50 each now; later extras: €0.50 excl. VAT at period end, never charged twice. Legacy rights keep the free unit and arrears until voluntary conversion. VORAN invoices through Stripe. Each watch identity counts once per period, even if closed, regardless of agent. Contract 0.7.0. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| amount_due_estimate | string|null | yes | Excl. VAT at next boundary: prepaid overage_due_estimate + next_period_minimum (no repeated current minimum); legacy max(2.00, watches_billed × 0.50) in arrears. Null outside paid plan; unknown taxes… |
| billing | object|null | yes | Name and country of the Stripe customer, as entered at Stripe. |
| billing_reconciliation | object | – | Present when earlier prepaid usage has no confirmed delivery and can no longer be retried automatically. Unknown does not mean unbilled: reconcile the original identifiers with Stripe before any fina… |
| currency | – | yes | – |
| ends_on | string|null | yes | Last day of the plan when it is ENDING, or PAST_DUE with its stop asked; null otherwise. |
| initial_basket | object | – | Current initial basket owned by the token's account, from the same snapshot as the human Plan. Absent without a current selection: expired PREPARED/EXPIRED and fully activated PAID history are exclud… |
| initial_payment_confirmed | boolean | yes | Applicable full initial payment confirmed server-side for accepted amount, offer and identities. Not return/card/active flag/zero invoice. Check version and period. |
| invoiced_by | – | yes | – |
| invoices | array | yes | – |
| minimum_covers | – | yes | Prepaid covers first 4 counted watches. Legacy counts paid watches only, excluding its free watch. |
| monthly_minimum | – | yes | €2 excl. VAT per period, even empty: prepaid at start; legacy in arrears. |
| next_invoice | object|null | yes | Stripe period end and excl. VAT estimate: ended-period overage + next minimum for prepaid; null outside paid plan. |
| next_period_minimum | – | yes | Active prepaid: 2.00 excl. VAT for renewal, 0.00 if ending at boundary; null otherwise. |
| offer_version | – | yes | Server-assigned; legacy rights retained until voluntary conversion. Clients cannot select legacy. |
| overage_due_estimate | string|null | yes | Active prepaid, excl. VAT at period end: first period max(0,M-max(4,N))×0.50; later max(0,M-4)×0.50. N=initial paid basket, M=counted identities. Null otherwise. |
| payment | object|null | yes | The payment method lives at Stripe; no digit of it is stored or returned. |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| plan | – | yes | Technical state, not entitlement: check version, first payment and period. FREE right only for legacy. PAST_DUE: renewal retries. ENDING: existing prepaid watches to boundary, no new ones. ENDED: no… |
| price_per_watch_month | – | yes | – |
| since | string|null | yes | First day of the paid plan; null outside PAID, PAST_DUE and ENDING. |
| summary | string | yes | One English/French sentence, per request or organisation language. |
| unit | – | yes | – |
| upfront_amount | string | yes | Excl. VAT, identical on human Plan/API/MCP: current unpaid initial_basket amount max(2.00,N×0.50); otherwise 2.00 before new prepaid with no selection, or 0.00 if already paid or legacy. A paid unres… |
| watches | array | yes | – |
| watches_billed | integer | yes | Prepaid identities counted once if active at start or activated in [start,end). Closed exactly at start excluded; later closure restores no unit. Legacy excludes free watch, retaining prior period ru… |
| watches_total | integer | yes | watches[] count: active and closed within 30 days. |
No examples provided.
get_solution Get a catalogue record ~127
Returns one HODDS catalogue record by id (an option id returned by search_solutions): name, homepage, summary in English and French, processes (the first is primary), keywords, pricing models without amounts (empty means unknown) with the pricing page, interfaces (public API, MCP server, self-hosting: yes, no or unknown), markets, publisher, dated sources and status. Status non_attested means the publisher has not confirmed the record; unknown values are stated as unknown. Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Solution id, e.g. "n8n". |
| Name | Type | Req | Description |
|---|---|---|---|
| added_on | string | yes | – |
| data_portability | object | – | Documented export formats (lowercase) and catalogue ids of solutions the publisher documents an import from. Omitted, empty or without source = unknown. |
| data_residency | array | – | Regions where the publisher documents that customer data is stored: EU or ISO 3166-1 alpha-2 codes. Omitted or empty = unknown. |
| founder_link | string | – | Declared link between the HODDS founder and the solution. Never affects ranking. |
| hodds_status | object | – | HODDS review status, distinct from status (publisher attestation). approved = reviewed by HODDS on checked_on, shown as "Approved by HODDS"; not_yet = listed, not reviewed yet, shown as "Not yet appr… |
| id | string | yes | Stable slug, unique in the catalogue. Equals the file name without .json. |
| interfaces | object | yes | – |
| keywords | array | yes | Lowercase search terms in English and French describing what the solution does. Never another product's name. (scripts/catalogue.mjs checks lowercase for every script.) |
| markets | array | – | ISO 3166-1 alpha-2 codes where the documented offer applies, or global. Omitted = not documented. |
| name | string | yes | – |
| open_source | – | – | Whether the solution is published under an open-source licence. Omitted = unknown. |
| pricing | object | yes | – |
| processes | array | yes | Process ids from catalogue/processes.json (checked by scripts/catalogue.mjs). processes[0] is the primary process and decides the folder catalogue/solutions/<group>/. |
| publisher | string | – | – |
| sources | array | yes | Official pages actually read to write this record. |
| status | – | yes | Publisher attestation. non_attested: the publisher has not attested this record. withdrawn is a reserved value for solutions that left the portfolio; no record carries it yet. Corrections: see /contr… |
| summary | object | yes | Factual description taken from the official source. No superlatives, no comparisons, no unverifiable claims. |
| url | string | yes | Official homepage. |
| version | object | – | Current version as published by the publisher. source = the publisher's official page that states it. |
| withdrawn_on | string | – | Day the solution left the portfolio. Allowed only when status is withdrawn. |
No examples provided.
get_watch Read a watch ~126
Returns one watch of the organisation: constraints, solution in place, challenger with its switch brief and HODDS status, challenger_reason when there is none, and the 50 most recent alerts, unacknowledged first (all: true for 200). Reading does not acknowledge. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
| Name | Type | Req | Description |
|---|---|---|---|
| all | boolean | – | true: the 200 most recent alerts. |
| watch_id | string | yes | Watch id returned by watch_need or list_watches (w_...). |
| Name | Type | Req | Description |
|---|---|---|---|
| alert_budget | integer | – | – |
| alerts | array | yes | The 50 most recent alerts, unacknowledged first (200 with all=true). |
| baseline_request_id | string|null | – | Search request_id that deduced process; null if process supplied. |
| challenger | object|null | yes | – |
| challenger_reason | – | yes | – |
| constraints | array | yes | – |
| created_at | string | yes | – |
| current_choice | string|null | yes | – |
| current_choice_name | string|null | – | Unlinked name. |
| duplicate | boolean | – | Opening: existing active watch reused. |
| last_review_at | string|null | – | – |
| level | – | yes | – |
| need | string|null | – | Natural-language need; absent/null for CATEGORY. |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| plan | string | yes | FREE: legacy only; prepaid-v1: PAID. Organisation entitlement: GET /api/plan. No drafts. |
| process | string | yes | – |
| quiet_since | string | yes | – |
| rules_version | string | yes | Public computation rules identifier; see /rules/. |
| status | – | yes | payment_required returns a DRAFT error, never ACTIVE success. |
| summary | string | – | One English/French sentence, per request. |
| target | object | – | – |
| watch_id | string | yes | – |
No examples provided.
list_gaps Read the demand data of a process ~114
Returns, for a subscribed process, the gaps formulated by HODDS and the client aggregates above the anonymity threshold (watched needs, organisations watching, NO_MATCH, current choices, constraints, challengers delivered, GAP_RESOLVED). No need text, no organisation, no agent. Contract 0.3.1. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
| Name | Type | Req | Description |
|---|---|---|---|
| process | string | yes | Process id of /catalogue/processes.json. |
| Name | Type | Req | Description |
|---|---|---|---|
| aggregates | object | yes | – |
| as_of | string | yes | – |
| gaps | array | yes | – |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| process | string | yes | Process id of /catalogue/processes.json. |
| rules_version | string | yes | – |
| summary | string | yes | One sentence in English, or in French when the request was in French (or in the language of the organisation). |
No examples provided.
list_processes List processes ~70
Returns the HODDS process taxonomy: groups (for example "Run the business") and processes (for example "invoice-and-get-paid"), with English and French labels and the number of catalogue records per process. A process id is accepted as the `process` filter of search_solutions. Read-only.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| catalogue_version | string | yes | – |
| groups | array | yes | – |
| processes | array | yes | – |
| solution_count | integer | yes | Number of solutions in the catalogue. |
No examples provided.
list_watches List watches ~80
Lists the watches of the organisation with their challenger and number of pending alerts; include_closed adds the watches closed in the last 30 days. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
| Name | Type | Req | Description |
|---|---|---|---|
| include_closed | boolean | – | true: include watches closed in the last 30 days. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| free_watch_used | boolean | yes | Historical free-watch indicator; false grants no prepaid right. See GET /api/plan.offer_version. |
| offer_version | string | – | – |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| summary | string | – | One sentence in English, or in French when the request was in French. |
| watches | array | yes | – |
No examples provided.
rate_alert Rate an alert ~114
Marks one alert relevant or not_relevant, with an optional note of at most 500 characters. It never changes ranking. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_id | string | yes | Alert id (a_...). |
| note | string | – | Optional note. |
| rating | string | yes | relevant or not_relevant. |
| watch_id | string | yes | Watch id returned by watch_need or list_watches (w_...). |
| Name | Type | Req | Description |
|---|---|---|---|
| alert_id | string | yes | – |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| rating | – | yes | – |
| summary | string | – | One sentence in English, or in French when the request was in French. |
No examples provided.
read_choice Read a software choice ~212
Public read: capabilities discovers IDs and context vocabulary; candidates finds IDs for a priority; compare compares 2–3 IDs; specification reads one dossier. Same operation/input with representation detail, transport.resume and reference reads a snapshot field or page. On 409 restart summary. No account or writes. Sources, unknowns and dated limits remain explicit. Read the single JSON content.text Outcome (no structuredContent). Candidate priority operators by discovered value_type: boolean equals true only; quantity (integer) or amount ({minor,currency,tax_basis}) equals, at_least, at_most; set equals, or contains with a nonempty array; enum equals a member of enum_values. Text is not a candidate priority. Use the request schema for required keys and vocabularies for values; comparison_rule does not define priority operators or imply superiority.
| Name | Type | Req | Description |
|---|---|---|---|
| input | object | – | – |
| operation | string | yes | – |
| reference | object | – | – |
| representation | string | – | – |
| resume | object | – | – |
No output schema declared.
No examples provided.
search_solutions Search software for a need ~287
Searches the HODDS catalogue of software, SaaS, APIs and online services, organised by business process, for records that match a need written in English or French (for example "transcribe my meetings" or "automatiser mes workflows"). Returns a request_id, a status and up to `limit` options; each option has an id, a label, a short description and source URLs (provenance). Ranking combines lexical matching on record names, keywords and processes with semantic similarity (multilingual embeddings on Cloudflare Workers AI), or lexical matching alone when the semantic part is unavailable; ownership or sponsorship never changes it. Confidence is always UNKNOWN: records are non-attested facts taken from publishers' public pages. Status NO_MATCH with an empty option list means that no record matches the need closely enough, or that the need belongs to a process with no record yet; results are never padded. Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| lang | string | – | Language of option descriptions: "en" (default) or "fr". |
| limit | integer | – | Maximum number of options to return (1-50, default 10). |
| need | string | yes | The need in natural language, English or French: the task to get done. |
| process | string | – | Optional process id that restricts the search (ids from list_processes, e.g. "automate-workflows"). |
| Name | Type | Req | Description |
|---|---|---|---|
| options | array | yes | – |
| request_id | string | yes | – |
| status | – | yes | – |
No examples provided.
send_feedback Report an outcome ~184
Stores a declarative outcome report for an option returned by search_solutions: outcome YES (the option met the need), PARTLY or NO, with the request_id and the option id exactly as returned. It is the only HODDS tool that writes data without a token; the watch tools (watch_need and the others) write only with an organisation token. The report is stored as an unverified caller statement and never changes ranking by itself; the same report sent twice is stored once. When feedback storage is unavailable on the deployment, the tool returns an error and stores nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| option_id | string | yes | id of the option being reported. |
| outcome | string | yes | YES: the option met the need. PARTLY: in part. NO: it did not. |
| request_id | string | yes | request_id returned by search_solutions (req_...). |
| Name | Type | Req | Description |
|---|---|---|---|
| status | – | yes | – |
No examples provided.
set_creator_processes Set the subscribed processes ~148
Replaces the list of subscribed processes. Without an active subscription the result has status 402 and a Stripe Checkout destination for a person to open. With one, an addition through this tool also answers status 402 with the Plan page as destination: nothing is charged here, only the page charges, after a person confirms it. Removals apply at once and the removed processes stay readable until the end of the paid period. An empty list is refused (empty_selection): use cancel_creator_plan. Contract 0.3.1. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
| Name | Type | Req | Description |
|---|---|---|---|
| processes | array | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
set_current_choice Change the solution in place ~111
Sets a solution by id or free name (any process), null clears. Returns the watch; challenger recomputed later. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
| Name | Type | Req | Description |
|---|---|---|---|
| current_choice | string|null | – | Catalogue id, or null. |
| current_choice_name | string|null | – | Free name instead of id, or null. |
| watch_id | string | yes | Watch id returned by watch_need or list_watches (w_...). |
| Name | Type | Req | Description |
|---|---|---|---|
| alert_budget | integer | – | – |
| alerts | array | yes | The 50 most recent alerts, unacknowledged first (200 with all=true). |
| baseline_request_id | string|null | – | Search request_id that deduced process; null if process supplied. |
| challenger | object|null | yes | – |
| challenger_reason | – | yes | – |
| constraints | array | yes | – |
| created_at | string | yes | – |
| current_choice | string|null | yes | – |
| current_choice_name | string|null | – | Unlinked name. |
| duplicate | boolean | – | Opening: existing active watch reused. |
| last_review_at | string|null | – | – |
| level | – | yes | – |
| need | string|null | – | Natural-language need; absent/null for CATEGORY. |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| plan | string | yes | FREE: legacy only; prepaid-v1: PAID. Organisation entitlement: GET /api/plan. No drafts. |
| process | string | yes | – |
| quiet_since | string | yes | – |
| rules_version | string | yes | Public computation rules identifier; see /rules/. |
| status | – | yes | payment_required returns a DRAFT error, never ACTIVE success. |
| summary | string | – | One English/French sentence, per request. |
| target | object | – | – |
| watch_id | string | yes | – |
No examples provided.
unwatch_need Close a watch ~74
Closes a watch; its need, constraints and alerts are erased 30 days after closing. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
| Name | Type | Req | Description |
|---|---|---|---|
| watch_id | string | yes | Watch id returned by watch_need or list_watches (w_...). |
| Name | Type | Req | Description |
|---|---|---|---|
| closed_at | string | yes | – |
| deleted_on | string | yes | – |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| status | – | yes | – |
| summary | string | – | One sentence in English, or in French when the request was in French. |
| watch_id | string | yes | – |
No examples provided.
watch_choice Document a watched software choice ~136
Requires a Bearer token and an existing owned NEED watch. bind explicitly attaches a canonical comparison request at expected_revision (optional explicit reset_baseline); review checks the current accepted documentary build; get reads the retained state and events with after/limit (1–50). No new watch, purchase or notification. A conflict requires an explicit caller decision; no automatic retry or reset.
| Name | Type | Req | Description |
|---|---|---|---|
| after | integer | – | – |
| expected_revision | integer | – | – |
| limit | integer | – | – |
| operation | string | yes | – |
| request | object | – | – |
| reset_baseline | boolean | – | – |
| watch_id | string | yes | – |
No output schema declared.
No examples provided.
watch_need Watch a need ~397
Watches a need; CATEGORY follows a process. Optional target selects one product and capability_ids (empty = whole product), counted once. Targeted alerts report documented changes, conditions and unknowns, not a guarantee of suitability. Initially not_computed; rules produce challenger/switch brief; alerts on following calls. Unknown constraints stay uninterpreted. prepaid-v1: payment_required (402), draft_id, watch_status DRAFT, destination /my/plan. Legacy: free_watch_used (409, Checkout). plan_ending (409) refuses new watches. Errors: _meta["ai.hodds/error"]. Search is free. Price: €2 excl. VAT at the start of each monthly period covers the first 4 counted watches; initial basket extras: €0.50 each now; later extras: €0.50 excl. VAT at period end, never charged twice. A person accepts the summary at destination. Legacy rights stay unchanged. Needs an organisation token (Authorization: Bearer hodds_...); without it the tool returns the error token_required.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_budget | integer | – | Alerts per calendar month (1-20, default 5); beyond, one DIGEST per day. |
| context | object | – | – |
| current_choice | string | – | Active catalogue id; any process accepted. |
| current_choice_name | string|null | – | Free name instead of id; exact unique matches resolve, others stay unlinked. |
| delivery | object | – | – |
| lang | string | – | Language of the summary: "en" or "fr". |
| level | string | – | NEED (default when need is given) or CATEGORY (process required, no need). |
| need | string | – | The need in natural language, English or French (absent for a CATEGORY watch). |
| process | string | – | Process id (from list_processes); deduced from the need when absent. |
| target | object | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| alert_budget | integer | – | – |
| alerts | array | yes | The 50 most recent alerts, unacknowledged first (200 with all=true). |
| baseline_request_id | string|null | – | Search request_id that deduced process; null if process supplied. |
| challenger | object|null | yes | – |
| challenger_reason | – | yes | – |
| constraints | array | yes | – |
| created_at | string | yes | – |
| current_choice | string|null | yes | – |
| current_choice_name | string|null | – | Unlinked name. |
| duplicate | boolean | – | Opening: existing active watch reused. |
| last_review_at | string|null | – | – |
| level | – | yes | – |
| need | string|null | – | Natural-language need; absent/null for CATEGORY. |
| pending | object | – | Delivery on the next call: alerts that wait for this organisation. Absent when there is nothing to deliver. Only ack_alerts empties it. |
| plan | string | yes | FREE: legacy only; prepaid-v1: PAID. Organisation entitlement: GET /api/plan. No drafts. |
| process | string | yes | – |
| quiet_since | string | yes | – |
| rules_version | string | yes | Public computation rules identifier; see /rules/. |
| status | – | yes | payment_required returns a DRAFT error, never ACTIVE success. |
| summary | string | – | One English/French sentence, per request. |
| target | object | – | – |
| watch_id | string | yes | – |
No examples provided.
How do I install the HODDS MCP server?
HODDS is a hosted endpoint at https://hodds.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · hodds.ai
claude mcp add --transport http ai-hodds-hodds 'https://hodds.ai/mcp'
What is the HODDS MCP server?
HODDS is an MCP server listed in the public MCP registry as ai.hodds/hodds. Find software, SaaS and APIs for a need in a sourced catalogue organised by business process. This page covers its hosted endpoint (https://hodds.ai/mcp).
Is the HODDS MCP server safe to use?
HODDS scores 68 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the HODDS MCP server expose?
HODDS exposes 21 tools: search_solutions, get_solution, list_processes, send_feedback, watch_need, and 16 more. Their descriptions and schemas cost roughly 3,084 tokens of context every time the server is loaded.
Does the HODDS MCP server require authentication?
No. We connected to HODDS without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the HODDS MCP server still maintained?
HODDS is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.