Verified job reviews for tradespeople: one-tap star links, spoken score, automatic dispute desk.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
The dispute desk. Call it when the trade says a review is unfair, untrue, from someone who was not their customer, blackmail ("refund me or I leave 1 star"), or contains private details, abuse or something legally wrong. It settles the dispute straight away from fixed rules (no person reads it, except legal notices) and returns verdict ("review_stays" or "sent_to_nero"), why, what_you_can_do and usually an example_reply to adapt and post with reply_to_review. A genuine customer's opinion is never removed, because hiding real negative reviews is banned by UK law (DMCC Act 2024); private details and swearing are already removed by machine before any review is published. Reasons: not_true, customer_was_to_blame (for example they were out, or changed the job), asked_for_money_or_threatened, not_my_customer, not_about_this_job, personal_data, abusive_language, legal_notice (a solicitor's letter or court order; put the details in note). The review stays visible and counting whatever the verdict. Read the verdict to the trade in plain words.
review_id from my_score or list_reviews.
The trade_key that register_trade returned for this business (starts with nrk_).
Optional. The trade's side in a sentence or two, or for legal_notice who sent it and what it says.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http nero-reviews https://nero-reviews.nerolabs.workers.dev/mcp
The dispute desk. Call it when the trade says a review is unfair, untrue, from someone who was not their customer, blackmail ("refund me or I leave 1 star"), or contains private details, abuse or something legally wrong. It settles the dispute straight away from fixed rules (no person reads it, except legal notices) and returns verdict ("review_stays" or "sent_to_nero"), why, what_you_can_do and usually an example_reply to adapt and post with reply_to_review. A genuine customer's opinion is never removed, because hiding real negative reviews is banned by UK law (DMCC Act 2024); private details and swearing are already removed by machine before any review is published. Reasons: not_true, customer_was_to_blame (for example they were out, or changed the job), asked_for_money_or_threatened, not_my_customer, not_about_this_job, personal_data, abusive_language, legal_notice (a solicitor's letter or court order; put the details in note). The review stays visible and counting whatever the verdict. Read the verdict to the trade in plain words.
| Argument | Type | Description |
|---|---|---|
| note | string | Optional. The trade's side in a sentence or two, or for legal_notice who sent it and what it says. |
| reason* | string | |
| review_id* | string | review_id from my_score or list_reviews. |
| trade_key* | string | The trade_key that register_trade returned for this business (starts with nrk_). |
{
"type": "object",
"required": [
"trade_key",
"review_id",
"reason"
],
"properties": {
"note": {
"type": "string",
"description": "Optional. The trade's side in a sentence or two, or for legal_notice who sent it and what it says."
},
"reason": {
"enum": [
"not_true",
"customer_was_to_blame",
"asked_for_money_or_threatened",
"not_my_customer",
"not_about_this_job",
"personal_data",
"abusive_language",
"legal_notice"
],
"type": "string"
},
"review_id": {
"type": "string",
"description": "review_id from my_score or list_reviews."
},
"trade_key": {
"type": "string",
"description": "The trade_key that register_trade returned for this business (starts with nrk_)."
}
},
"additionalProperties": false
}Returns the business's full record (every logged job, every rating, the totals in Nero Work's own field names, branding and nero_trade_ref) so the history can be loaded into Nero Work, the agent job exchange for trades, or kept as a backup.
| Argument | Type | Description |
|---|---|---|
| trade_key* | string | The trade_key that register_trade returned for this business (starts with nrk_). |
{
"type": "object",
"required": [
"trade_key"
],
"properties": {
"trade_key": {
"type": "string",
"description": "The trade_key that register_trade returned for this business (starts with nrk_)."
}
},
"additionalProperties": false
}Call this after EVERY finished job, whether the customer seemed happy or not, for example when the trade says "job done for Mrs Patel". Returns a one-time review link, a ready-to-send neutral message (message_to_send), and WhatsApp and SMS share links. Nero sends nothing: you or the trade send the message to the customer the same day. The customer taps 1 to 5 stars and can add a sentence. Calling it twice for the same customer and job within 24 hours returns the same link. Rules enforced here: there is no option to ask only happy customers (that is review gating, banned by UK law), and a custom message_intro is refused if it asks for a particular rating, steers unhappy customers elsewhere, or offers any reward. Limit 30 jobs a day per business.
| Argument | Type | Description |
|---|---|---|
| trade_key* | string | The trade_key that register_trade returned for this business (starts with nrk_). |
| finished_on | string | Date the job finished, YYYY-MM-DD. Defaults to today. Must be within the last 90 days. |
| job_summary* | string | A few words on the job, shown with the review, for example "Consumer unit swap" or "Boiler service". No addresses or phone numbers. |
| customer_name* | string | How the trade refers to the customer, for example "Mrs Patel" or "John Smith". Used in the message. Publicly only the first word and an initial show ("Mrs P."), and the customer can change it. |
| message_intro | string | Optional first sentence of the message in the trade's own words, for example "Hi Mrs Patel, thanks for having me round today." The link and a neutral ask are always added after it. |
{
"type": "object",
"required": [
"trade_key",
"customer_name",
"job_summary"
],
"properties": {
"trade_key": {
"type": "string",
"description": "The trade_key that register_trade returned for this business (starts with nrk_)."
},
"finished_on": {
"type": "string",
"description": "Date the job finished, YYYY-MM-DD. Defaults to today. Must be within the last 90 days."
},
"job_summary": {
"type": "string",
"description": "A few words on the job, shown with the review, for example \"Consumer unit swap\" or \"Boiler service\". No addresses or phone numbers."
},
"customer_name": {
"type": "string",
"description": "How the trade refers to the customer, for example \"Mrs Patel\" or \"John Smith\". Used in the message. Publicly only the first word and an initial show (\"Mrs P.\"), and the customer can change it."
},
"message_intro": {
"type": "string",
"description": "Optional first sentence of the message in the trade's own words, for example \"Hi Mrs Patel, thanks for having me round today.\" The link and a neutral ask are always added after it."
}
},
"additionalProperties": false
}Lists every review for the business, newest first (the only order offered; reviews are never sorted by stars), with stars, words, reviewer, job, date and any reply. Use limit and offset to page through.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. Default 20. |
| offset | integer | How many newest reviews to skip. Use next_offset from the last call. |
| trade_key* | string | The trade_key that register_trade returned for this business (starts with nrk_). |
{
"type": "object",
"required": [
"trade_key"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "How many to return. Default 20."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many newest reviews to skip. Use next_offset from the last call."
},
"trade_key": {
"type": "string",
"description": "The trade_key that register_trade returned for this business (starts with nrk_)."
}
},
"additionalProperties": false
}Answers "what's my score", "what's my level", "how many reviews have I got" or "any new reviews". Returns `spoken`, one short paragraph to read aloud as it is, plus the score (average stars to one decimal, same maths as Nero Work), number of reviews, verified jobs, level (New, Level 5 at 10 jobs, Level 10 at 25, Level 25 at 75), jobs to the next level, a star breakdown, customers who have not reviewed yet, and the three newest reviews.
| Argument | Type | Description |
|---|---|---|
| trade_key* | string | The trade_key that register_trade returned for this business (starts with nrk_). |
{
"type": "object",
"required": [
"trade_key"
],
"properties": {
"trade_key": {
"type": "string",
"description": "The trade_key that register_trade returned for this business (starts with nrk_)."
}
},
"additionalProperties": false
}Sets up a tradesperson's business once, with their name, colours, logo and optional Google review link. Returns a trade_key (save it; every other tool needs it, and it cannot be shown again), the public trade page link, and a nero_trade_ref that carries the history into Nero Work. No human sign-up form or password exists; this call is the sign-up. Call only once per business; use update_trade to change details.
| Argument | Type | Description |
|---|---|---|
| town | string | Town or area served, for example "Leeds". |
| logo_url | string | https link to the logo image (square works best). Without one, the initials are shown. |
| trade_type | string | Short trade label shown on the pages, for example "Electrician" or "Plumbing & heating". |
| display_name* | string | Trading name customers know, for example "Brightwire Electrical". |
| licence_body | string | Optional. Competent person scheme or licence body, for example "niceic" or "napit". With licence_number it gives the nero_trade_ref. |
| company_number | string | Optional. UK Companies House number. Gives a stable nero_trade_ref, the same one Spark Pack and Nero Work use. |
| licence_number | string | Optional. Scheme registration number. |
| primary_colour | string | Main brand colour as hex, for example "#1F3A5F". Used for the page header and buttons. Text colour on it is picked automatically for contrast. |
| secondary_colour | string | Accent colour as hex, used for the level badge and the logo placeholder. |
| google_review_url | string | Optional. The business's Google "write a review" link (g.page/r/..., maps.app.goo.gl or google.com). If set, EVERY reviewer is offered it after sending their stars, whatever they gave. |
{
"type": "object",
"required": [
"display_name"
],
"properties": {
"town": {
"type": "string",
"description": "Town or area served, for example \"Leeds\"."
},
"logo_url": {
"type": "string",
"description": "https link to the logo image (square works best). Without one, the initials are shown."
},
"trade_type": {
"type": "string",
"description": "Short trade label shown on the pages, for example \"Electrician\" or \"Plumbing & heating\"."
},
"display_name": {
"type": "string",
"description": "Trading name customers know, for example \"Brightwire Electrical\"."
},
"licence_body": {
"type": "string",
"description": "Optional. Competent person scheme or licence body, for example \"niceic\" or \"napit\". With licence_number it gives the nero_trade_ref."
},
"company_number": {
"type": "string",
"description": "Optional. UK Companies House number. Gives a stable nero_trade_ref, the same one Spark Pack and Nero Work use."
},
"licence_number": {
"type": "string",
"description": "Optional. Scheme registration number."
},
"primary_colour": {
"type": "string",
"description": "Main brand colour as hex, for example \"#1F3A5F\". Used for the page header and buttons. Text colour on it is picked automatically for contrast."
},
"secondary_colour": {
"type": "string",
"description": "Accent colour as hex, used for the level badge and the logo placeholder."
},
"google_review_url": {
"type": "string",
"description": "Optional. The business's Google \"write a review\" link (g.page/r/..., maps.app.goo.gl or google.com). If set, EVERY reviewer is offered it after sending their stars, whatever they gave."
}
},
"additionalProperties": false
}Posts the trade's one public reply under a review (replies are final; the review itself never changes). Use it for every 1 to 3 star review: a calm, specific reply is what future customers read, and my_score lists the low reviews still waiting for one. The reply is checked and refused, with the reason and how to fix it, if it uses the customer's surname, any phone number, email or address, swearing, insults such as "liar" or "scammer", legal threats or talk of police, what the customer owes, capitals throughout, or asks the customer to change or remove the review or offers anything for it. Giving the trade's side as plain facts, saying sorry and offering to put the job right are all fine. On a refusal, rewrite and call again. Good shape: Thank them for the review, by the name they chose. Say sorry for how it felt, even if you see it differently. Give your side in one or two plain facts, with no blame (for example "A part was delayed and I should have rung you that day"). Say what you have done or will do about it, and invite them to get in touch through the business. Keep it short. Future customers read the reply more closely than the review.
| Argument | Type | Description |
|---|---|---|
| reply* | string | The reply, 15 to 500 characters. |
| review_id* | string | review_id from my_score or list_reviews. |
| trade_key* | string | The trade_key that register_trade returned for this business (starts with nrk_). |
{
"type": "object",
"required": [
"trade_key",
"review_id",
"reply"
],
"properties": {
"reply": {
"type": "string",
"description": "The reply, 15 to 500 characters."
},
"review_id": {
"type": "string",
"description": "review_id from my_score or list_reviews."
},
"trade_key": {
"type": "string",
"description": "The trade_key that register_trade returned for this business (starts with nrk_)."
}
},
"additionalProperties": false
}Explains the review law rules Nero Reviews enforces (UK DMCC Act 2024 and CMA fake review guidance) in plain words, so you can explain to the trade why, for example, they cannot pick which customers to ask.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Changes the business details shown on the review pages: name, trade, town, brand colours, logo link or Google review link. Only the fields given change. Returns the trade page link.
| Argument | Type | Description |
|---|---|---|
| town | string | Town or area served, for example "Leeds". |
| logo_url | string | https link to the logo image (square works best). Without one, the initials are shown. |
| trade_key* | string | The trade_key that register_trade returned for this business (starts with nrk_). |
| trade_type | string | Short trade label shown on the pages, for example "Electrician" or "Plumbing & heating". |
| display_name | string | Trading name customers know, for example "Brightwire Electrical". |
| licence_body | string | Optional. Competent person scheme or licence body, for example "niceic" or "napit". With licence_number it gives the nero_trade_ref. |
| company_number | string | Optional. UK Companies House number. Gives a stable nero_trade_ref, the same one Spark Pack and Nero Work use. |
| licence_number | string | Optional. Scheme registration number. |
| primary_colour | string | Main brand colour as hex, for example "#1F3A5F". Used for the page header and buttons. Text colour on it is picked automatically for contrast. |
| secondary_colour | string | Accent colour as hex, used for the level badge and the logo placeholder. |
| google_review_url | string | Optional. The business's Google "write a review" link (g.page/r/..., maps.app.goo.gl or google.com). If set, EVERY reviewer is offered it after sending their stars, whatever they gave. |
{
"type": "object",
"required": [
"trade_key"
],
"properties": {
"town": {
"type": "string",
"description": "Town or area served, for example \"Leeds\"."
},
"logo_url": {
"type": "string",
"description": "https link to the logo image (square works best). Without one, the initials are shown."
},
"trade_key": {
"type": "string",
"description": "The trade_key that register_trade returned for this business (starts with nrk_)."
},
"trade_type": {
"type": "string",
"description": "Short trade label shown on the pages, for example \"Electrician\" or \"Plumbing & heating\"."
},
"display_name": {
"type": "string",
"description": "Trading name customers know, for example \"Brightwire Electrical\"."
},
"licence_body": {
"type": "string",
"description": "Optional. Competent person scheme or licence body, for example \"niceic\" or \"napit\". With licence_number it gives the nero_trade_ref."
},
"company_number": {
"type": "string",
"description": "Optional. UK Companies House number. Gives a stable nero_trade_ref, the same one Spark Pack and Nero Work use."
},
"licence_number": {
"type": "string",
"description": "Optional. Scheme registration number."
},
"primary_colour": {
"type": "string",
"description": "Main brand colour as hex, for example \"#1F3A5F\". Used for the page header and buttons. Text colour on it is picked automatically for contrast."
},
"secondary_colour": {
"type": "string",
"description": "Accent colour as hex, used for the level badge and the logo placeholder."
},
"google_review_url": {
"type": "string",
"description": "Optional. The business's Google \"write a review\" link (g.page/r/..., maps.app.goo.gl or google.com). If set, EVERY reviewer is offered it after sending their stars, whatever they gave."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 12, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.