thinkhard.SI

Tools reference, with real answers.

Every tool the thinkhard.si MCP server offers: what the AI is told about it, its parameters, the fields it returns and a real call with its real answer. The answers below come from the live server code, recorded on each release.

The server address is https://thinkhard.si/mcp. Every tool is read-only, so a client can run them without asking each time.

  1. search_promptsSearch the prompt repository
  2. get_promptGet a prompt template
  3. list_collectionsList the prompt collections
  4. grade_promptGrade a prompt out of 10
  5. estimate_ai_costEstimate what an AI feature costs
  6. check_robot_speakFind what makes a text sound like AIlocal
  7. fact_check_listList the facts to check in an AI answerlocal
  8. prompts/getEvery template as an MCP prompt

search_prompts

Remote and localRead-only

Search the prompt repository

Find ready-made, expert prompt templates for a work task in the thinkhard.si repository (300+ prompts for email, meetings, presentations, job search, marketing, sales, support, HR, finance, legal, spreadsheets, research and more). Use it whenever the user wants to write, plan, summarize, analyze or draft something at work, before writing a prompt from scratch. Then call get_prompt with the slug.

Parameters

ParameterTypeWhat it is
queryrequiredstringWhat the user wants to do, in plain words, for example "cover letter" or "summarize a long contract".
collectionstringLimit to one collection (see list_collections).
The 20 allowed values

office (Email, meetings & presentations), writing (Writing & editing), marketing, careers (Job search & careers), sales, support (Customer support & success), management (Managers & leads), people (Hiring & people), projects (Project management), research (Research & learning), data (Data & spreadsheets), finance (Finance & accounting), legal (Legal & compliance), operations, smallbiz (Small business), education (Teaching & training), product, engineering (Engineering & code), system (Assistants & system prompts), media (Image & video)

modelstringOnly prompts laid out for this kind of model. One of: claude, gpt, gemini, any (Any chat model), agent (Coding agent), midjourney, image (Image model, plain language), video (Video model).
limitintegerDefault 8. From 1 to 25.

Returns

A text answer for the AI to read, and structuredContent with these fields, matching the tool's outputSchema:

FieldTypeWhat it is
prompts[]array of objectsBest match first. Empty when nothing matches.
prompts[].idstringRegistry number, such as CAR-002.
prompts[].slugstringPass it to get_prompt.
prompts[].titlestring
prompts[].usestringWhen to use it.
prompts[].collectionstringThe collection it belongs to.
prompts[].laid_out_forstringThe kind of model it is laid out for.
prompts[].scoreintegerIts own grade out of 10.
prompts[].urlstringIts page on thinkhard.si.

Example

Example call

curl -s https://thinkhard.si/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_prompts","arguments":{"query":"turn meeting notes into action items","limit":3}}}'

What the AI reads back

Prompts in the thinkhard.si repository for "turn meeting notes into action items":

1. Turn meeting notes into decisions and action items (OFF-003, Email, meetings & presentations, laid out for Claude)
   You have messy notes or an auto-generated transcript and need a short summary of what was decided and who is doing what, to send to the group.
   slug: meeting-notes-to-action-items
2. System prompt for a meeting-notes assistant (SYS-005, Assistants & system prompts, laid out for GPT)
   Your app turns meeting transcripts into notes, and they must record decisions and action items accurately, never inventing an owner or a deadline.
   slug: meeting-notes-assistant-system-prompt
3. Turn feature notes into a one-page spec (PRD-002, Product, laid out for GPT)
   You have a feature idea and scattered notes, and need a short spec that engineers and designers can challenge before work starts.
   slug: one-page-product-spec

Call get_prompt with a slug for the full prompt and its blanks.
structuredContent, for code
{
  "prompts": [
    {
      "id": "OFF-003",
      "slug": "meeting-notes-to-action-items",
      "title": "Turn meeting notes into decisions and action items",
      "use": "You have messy notes or an auto-generated transcript and need a short summary of what was decided and who is doing what, to send to the group.",
      "collection": "Email, meetings & presentations",
      "laid_out_for": "Claude",
      "score": 10,
      "url": "https://thinkhard.si/templates/meeting-notes-to-action-items/"
    },
    {
      "id": "SYS-005",
      "slug": "meeting-notes-assistant-system-prompt",
      "title": "System prompt for a meeting-notes assistant",
      "use": "Your app turns meeting transcripts into notes, and they must record decisions and action items accurately, never inventing an owner or a deadline.",
      "collection": "Assistants & system prompts",
      "laid_out_for": "GPT",
      "score": 10,
      "url": "https://thinkhard.si/templates/meeting-notes-assistant-system-prompt/"
    },
    {
      "id": "PRD-002",
      "slug": "one-page-product-spec",
      "title": "Turn feature notes into a one-page spec",
      "use": "You have a feature idea and scattered notes, and need a short spec that engineers and designers can challenge before work starts.",
      "collection": "Product",
      "laid_out_for": "GPT",
      "score": 10,
      "url": "https://thinkhard.si/templates/one-page-product-spec/"
    }
  ]
}

get_prompt

Remote and localRead-only

Get a prompt template

Get the full text of one prompt from the thinkhard.si repository by its slug, registry number (such as CAR-001) or exact title, with its {{blanks}}, what goes in each, and why it works. If the name does not match exactly, it answers with the closest matches instead. Pass values to fill blanks with the user's details. Ask the user for any blank you cannot fill from the conversation instead of inventing it.

Parameters

ParameterTypeWhat it is
promptrequiredstringThe slug, registry number or exact title from search_prompts.
valuesobject of stringsBlank name → the user's text, for example {"job_posting": "..."}.

Returns

A text answer for the AI to read, and structuredContent with these fields, matching the tool's outputSchema:

FieldTypeWhat it is
idstringRegistry number.
slugstring
titlestring
systemstringThe system prompt, with the given values filled in. Empty when the template has none.
promptstringThe user message, with the given values filled in.
open_blanks[]array of stringsBlanks still to fill. Ask the user for these.
urlstring

Example

Example call

curl -s https://thinkhard.si/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_prompt","arguments":{"prompt":"upset-customer-reply","values":{"company":"Northwind Bikes","customer_message":"My order arrived with a cracked frame and nobody has answered my emails for a week."}}}}'

What the AI reads back

# Reply to an upset customer
SUP-001 in the thinkhard.si prompt repository, collection Customer support & success, laid out for Claude, score 10 out of 10.

Use it when: A customer is angry or frustrated, and you need a reply that calms things down without promising what your policy does not allow.

## System prompt
You are an experienced support lead at Northwind Bikes. You write replies to upset customers that calm the situation down: you stay specific, you take responsibility where the company got something wrong, and you never argue with how the customer feels.

## User message
<policy>
{{policy}}
</policy>

<account_facts>
{{account_facts}}
</account_facts>

<customer_message>
My order arrived with a cracked frame and nobody has answered my emails for a week.
</customer_message>

Write a reply to the customer message above, for a support agent to review and send. The customer is upset. The goal is to fix the problem and keep them as a customer, so the reply should read as if one person took the complaint seriously.

Structure the reply as three short paragraphs:
1. Name what went wrong in the customer's terms and acknowledge the effect it had on them, in one or two sentences. If the account facts show we made a mistake, apologize once, for that specific mistake.
2. Say exactly what we will do or have already done, using only actions the policy allows. If the customer has to do something, give numbered steps.
3. Say what happens next, by when, and how to reach the same person again.

Keep it under 170 words of plain text, with no headings or bullet points other than the steps, and sign it "{{agent_name}}".

Write in a warm, direct tone. Avoid stock phrases such as "We apologize for any inconvenience" or "We value your feedback", because upset customers read them as a brush-off. Do not dispute the customer's account of what happened, and do not offer refunds, credits or dates that the policy does not cover.

<example>
An opening that works: "You were charged twice this month and only found out when your card was declined somewhere else. That should not have happened, and I'm sorry."
</example>

If anything is outside the policy, or the account facts do not confirm what the customer describes, do not decide it yourself. Leave it out of the reply and add a first line that starts with "FOR THE AGENT:" and says what needs a decision.

## Blanks still to fill
- {{policy}}: The refund, credit and escalation rules the reply must follow, pasted from your policy or macros.
- {{account_facts}}: What your systems show about this customer and the issue: order, dates, charges, earlier contacts.
- {{agent_name}}: The name the reply is signed with.
Ask the user for these details. Do not invent them.

## Why it works
- Background facts: The policy, the account facts and the message each sit in their own XML tag above the instructions, which is how Anthropic recommends laying out long material for Claude.
- What to avoid: It rules out the stock phrases that make upset customers angrier and says why, so the model avoids the whole style, not just the listed words.
- If unsure: Anything the policy does not cover goes to a person with a FOR THE AGENT line, instead of the model inventing a refund or a date.

Source: https://thinkhard.si/templates/upset-customer-reply/ (free to use at work; please do not republish the collection).
structuredContent, for code
{
  "id": "SUP-001",
  "slug": "upset-customer-reply",
  "title": "Reply to an upset customer",
  "system": "You are an experienced support lead at Northwind Bikes. You write replies to upset customers that calm the situation down: you stay specific, you take responsibility where the company got something wrong, and you never argue with how the customer feels.",
  "prompt": "<policy>\n{{policy}}\n</policy>\n\n<account_facts>\n{{account_facts}}\n</account_facts>\n\n<customer_message>\nMy order arrived with a cracked frame and nobody has answered my emails for a week.\n</customer_message>\n\nWrite a reply to the customer message above, for a support agent to review and send. The customer is upset. The goal is to fix the problem and keep them as a customer, so the reply should read as if one person took the complaint seriously.\n\nStructure the reply as three short paragraphs:\n1. Name what went wrong in the customer's terms and acknowledge the effect it had on them, in one or two sentences. If the account facts show we made a mistake, apologize once, for that specific mistake.\n2. Say exactly what we will do or have already done, using only actions the policy allows. If the customer has to do something, give numbered steps.\n3. Say what happens next, by when, and how to reach the same person again.\n\nKeep it under 170 words of plain text, with no headings or bullet points other than the steps, and sign it \"{{agent_name}}\".\n\nWrite in a warm, direct tone. Avoid stock phrases such as \"We apologize for any inconvenience\" or \"We value your feedback\", because upset customers read them as a brush-off. Do not dispute the customer's account of what happened, and do not offer refunds, credits or dates that the policy does not cover.\n\n<example>\nAn opening that works: \"You were charged twice this month and only found out when your card was declined somewhere else. That should not have happened, and I'm sorry.\"\n</example>\n\nIf anything is outside the policy, or the account facts do not confirm what the customer describes, do not decide it yourself. Leave it out of the reply and add a first line that starts with \"FOR THE AGENT:\" and says what needs a decision.",
  "open_blanks": [
    "policy",
    "account_facts",
    "agent_name"
  ],
  "url": "https://thinkhard.si/templates/upset-customer-reply/"
}

list_collections

Remote and localRead-only

List the prompt collections

List the collections in the thinkhard.si prompt repository, with how many prompts each has.

Parameters

No parameters.

Returns

A text answer for the AI to read, and structuredContent with these fields, matching the tool's outputSchema:

FieldTypeWhat it is
collections[]array of objects
collections[].idstringPass it to search_prompts as collection.
collections[].codestringRegistry prefix, such as CAR.
collections[].namestring
collections[].blurbstring
collections[].countintegerPrompts in the collection.

Example

Example call

curl -s https://thinkhard.si/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_collections","arguments":{}}}'

What the AI reads back

Collections in the thinkhard.si prompt repository:

- Email, meetings & presentations (office, 29 prompts): Inbox replies, meeting notes, follow-ups and slides for the work that fills the week.
- Writing & editing (writing, 19 prompts): Edits that keep your voice, summaries that keep the numbers, rewrites that keep the meaning.
- Marketing (marketing, 26 prompts): Posts, emails, campaigns and plans that bring in customers, built from real facts instead of hype.
- Job search & careers (careers, 14 prompts): Resumes, interviews, raises and next steps in your own career, using only what you actually did.
- Sales (sales, 18 prompts): Outreach, proposals, call reviews and account plans that sell on the buyer's own words.
- Customer support & success (support, 20 prompts): Replies, triage, onboarding and reviews that stick to your policy and never invent a refund.
- Managers & leads (management, 18 prompts): Meeting prep, feedback, decision memos and updates that say what changed and what you need.
- Hiring & people (people, 20 prompts): Job posts, interview plans, feedback and policies written fairly, with a person making every decision.
- Project management (projects, 12 prompts): Plans, status updates, risks and launches that keep a project on track and its sponsors informed.
- Research & learning (research, 12 prompts): Get up to speed, read long documents and turn sources into answers you can check.
- Data & spreadsheets (data, 17 prompts): Formulas, macros, survey themes with real counts and honest explanations of what the numbers show.
- Finance & accounting (finance, 16 prompts): Variance notes, budgets, cash forecasts and payment reminders that keep every number traceable.
- Legal & compliance (legal, 11 prompts): Contracts, policies and rules in plain English, ready for review by a lawyer. Never legal advice.
- Operations (operations, 14 prompts): Procedures, suppliers, schedules and inspections that keep the day-to-day running.
- Small business (smallbiz, 19 prompts): Plans, pricing, listings, reviews and client emails for owners who do everything themselves.
- Teaching & training (education, 15 prompts): Lesson plans, feedback, parent emails and onboarding material that teach one thing at a time.
- Product (product, 10 prompts): Interview synthesis, specs, roadmaps and pricing grounded in evidence.
- Engineering & code (engineering, 11 prompts): Briefs for coding agents with a check they can run, plus design docs and pull request write-ups.
- Assistants & system prompts (system, 10 prompts): Instructions for custom GPTs, Claude Projects, Gems, chatbots and tool-using agents.
- Image & video (media, 8 prompts): Scene descriptions for image and video models, from product shots to headshots and flyers.
structuredContent, for code
{
  "collections": [
    {
      "id": "office",
      "code": "OFF",
      "name": "Email, meetings & presentations",
      "blurb": "Inbox replies, meeting notes, follow-ups and slides for the work that fills the week.",
      "count": 29
    },
    {
      "id": "writing",
      "code": "WRT",
      "name": "Writing & editing",
      "blurb": "Edits that keep your voice, summaries that keep the numbers, rewrites that keep the meaning.",
      "count": 19
    },
    {
      "id": "marketing",
      "code": "MKT",
      "name": "Marketing",
      "blurb": "Posts, emails, campaigns and plans that bring in customers, built from real facts instead of hype.",
      "count": 26
    },
    {
      "id": "careers",
      "code": "CAR",
      "name": "Job search & careers",
      "blurb": "Resumes, interviews, raises and next steps in your own career, using only what you actually did.",
      "count": 14
    },
    {
      "id": "sales",
      "code": "SAL",
      "name": "Sales",
      "blurb": "Outreach, proposals, call reviews and account plans that sell on the buyer's own words.",
      "count": 18
    },
    {
      "id": "support",
      "code": "SUP",
      "name": "Customer support & success",
      "blurb": "Replies, triage, onboarding and reviews that stick to your policy and never invent a refund.",
      "count": 20
    },
    {
      "id": "management",
      "code": "MGT",
      "name": "Managers & leads",
      "blurb": "Meeting prep, feedback, decision memos and updates that say what changed and what you need.",
      "count": 18
    },
    {
      "id": "people",
      "code": "PPL",
      "name": "Hiring & people",
      "blurb": "Job posts, interview plans, feedback and policies written fairly, with a person making every decision.",
      "count": 20
    },
    {
      "id": "projects",
      "code": "PRJ",
      "name": "Project management",
      "blurb": "Plans, status updates, risks and launches that keep a project on track and its sponsors informed.",
      "count": 12
    },
    {
      "id": "research",
      "code": "RES",
      "name": "Research & learning",
      "blurb": "Get up to speed, read long documents and turn sources into answers you can check.",
      "count": 12
    },
    {
      "id": "data",
      "code": "DAT",
      "name": "Data & spreadsheets",
      "blurb": "Formulas, macros, survey themes with real counts and honest explanations of what the numbers show.",
      "count": 17
    },
    {
      "id": "finance",
      "code": "FIN",
      "name": "Finance & accounting",
      "blurb": "Variance notes, budgets, cash forecasts and payment reminders that keep every number traceable.",
      "count": 16
    },
    {
      "id": "legal",
      "code": "LEG",
      "name": "Legal & compliance",
      "blurb": "Contracts, policies and rules in plain English, ready for review by a lawyer. Never legal advice.",
      "count": 11
    },
    {
      "id": "operations",
      "code": "OPS",
      "name": "Operations",
      "blurb": "Procedures, suppliers, schedules and inspections that keep the day-to-day running.",
      "count": 14
    },
    {
      "id": "smallbiz",
      "code": "SMB",
      "name": "Small business",
      "blurb": "Plans, pricing, listings, reviews and client emails for owners who do everything themselves.",
      "count": 19
    },
    {
      "id": "education",
      "code": "EDU",
      "name": "Teaching & training",
      "blurb": "Lesson plans, feedback, parent emails and onboarding material that teach one thing at a time.",
      "count": 15
    },
    {
      "id": "product",
      "code": "PRD",
      "name": "Product",
      "blurb": "Interview synthesis, specs, roadmaps and pricing grounded in evidence.",
      "count": 10
    },
    {
      "id": "engineering",
      "code": "ENG",
      "name": "Engineering & code",
      "blurb": "Briefs for coding agents with a check they can run, plus design docs and pull request write-ups.",
      "count": 11
    },
    {
      "id": "system",
      "code": "SYS",
      "name": "Assistants & system prompts",
      "blurb": "Instructions for custom GPTs, Claude Projects, Gems, chatbots and tool-using agents.",
      "count": 10
    },
    {
      "id": "media",
      "code": "MED",
      "name": "Image & video",
      "blurb": "Scene descriptions for image and video models, from product shots to headshots and flyers.",
      "count": 8
    }
  ]
}

grade_prompt

Remote and localRead-only

Grade a prompt out of 10

Score a prompt out of 10 on the ten checks thinkhard.si uses (what to make, who it is for, background facts, length, format, what to avoid, what good looks like, an example, what to do if unsure, layout for the model). Returns which checks pass and a plain question for each one that fails. Rule-based and instant; use it to see what a prompt is missing before improving it.

Parameters

ParameterTypeWhat it is
promptrequiredstringThe prompt to grade (the user message).
systemstringOptional system prompt, graded together with the prompt.
targetstringThe model it is for. Layout is judged for this model. One of: claude, gpt, gemini, any (Any chat model), agent (Coding agent), midjourney, image (Image model, plain language), video (Video model). Default "any".

Returns

A text answer for the AI to read, and structuredContent with these fields, matching the tool's outputSchema:

FieldTypeWhat it is
scoreintegerOut of 10.
bandstringThe score in a word.
targetstringThe model it was read for.
checks[]array of objectsThe ten checks, in order.
checks[].checkstring
checks[].passboolean

Example

Example call

curl -s https://thinkhard.si/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"grade_prompt","arguments":{"prompt":"Write a cover letter for a marketing job. Make it sound professional."}}}'

What the AI reads back

Score: 3 out of 10 (Needs work), read as a prompt for Any chat model.

[pass] What to make: Says exactly what the AI should produce.
[pass] Who it's for: Names the reader, so the AI pitches it right.
[missing] Background facts: Gives the facts the AI cannot guess.
[missing] Length: Sets how long or how many.
[missing] Format: Says what shape the answer should take.
[missing] What to avoid: Rules out what you do not want.
[pass] What good looks like: Describes the result you are hoping for.
[missing] An example: Shows a sample to match.
[missing] If unsure: Says what to do when something is missing.
[missing] Layout: Laid out the way your AI reads best.

To improve it, answer these and add the answers to the prompt:
- What facts should it use? Names, numbers, notes or text it cannot guess. Paste them in.
- How long should it be? A number works best.
- What shape should it take? 
- Anything it should avoid? 
- Got an example to match? Optional. Paste a sample you like, or describe one.
- If something is missing, what should it do? 
- Lay it out the way the target model reads best.

This is a rule-based check: it sees whether the prompt says each thing, not how well. Full grader: https://thinkhard.si/grader/
structuredContent, for code
{
  "score": 3,
  "band": "Needs work",
  "target": "any",
  "checks": [
    {
      "check": "What to make",
      "pass": true
    },
    {
      "check": "Who it's for",
      "pass": true
    },
    {
      "check": "Background facts",
      "pass": false
    },
    {
      "check": "Length",
      "pass": false
    },
    {
      "check": "Format",
      "pass": false
    },
    {
      "check": "What to avoid",
      "pass": false
    },
    {
      "check": "What good looks like",
      "pass": true
    },
    {
      "check": "An example",
      "pass": false
    },
    {
      "check": "If unsure",
      "pass": false
    },
    {
      "check": "Layout",
      "pass": false
    }
  ]
}

estimate_ai_cost

Remote and localRead-only

Estimate what an AI feature costs

Estimate the monthly cost of running a prompt on current AI models (Claude, GPT, Gemini, DeepSeek, Qwen and others), from thinkhard.si's price catalog, which is checked against each provider's pricing page. Give token counts, or paste the prompt text to estimate them.

Parameters

ParameterTypeWhat it is
input_tokensintegerInput tokens per call. Omit to estimate from prompt_text. At least 0.
prompt_textstringThe prompt, to estimate input tokens (about 4 characters a token).
output_tokensintegerOutput tokens per call. Default 500. At least 0.
calls_per_monthintegerDefault 1000. At least 1.
modelsarray of stringsModel names or ids to include, such as "Claude Sonnet 5.5". Default: every current model.

Returns

A text answer for the AI to read, and structuredContent with these fields, matching the tool's outputSchema:

FieldTypeWhat it is
checkedstringWhen the prices were last checked against each provider.
calls_per_monthinteger
input_tokensinteger
output_tokensinteger
models[]array of objectsCheapest first.
models[].modelstring
models[].refstringProvider and model id.
models[].per_call_usdnumberUS dollars per call.
models[].monthly_usdnumberUS dollars a month.
models[].input_per_millionnumberUS dollars per million input tokens.
models[].output_per_millionnumberUS dollars per million output tokens.
models[].notestringEmpty unless something about the price needs saying.

Example

Example call

curl -s https://thinkhard.si/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"estimate_ai_cost","arguments":{"input_tokens":1200,"output_tokens":400,"calls_per_month":20000,"models":["Claude Sonnet 5.5","Claude Haiku 5.5","GPT-6.1 Sol","Gemini 3.8 Flash"]}}}'

What the AI reads back

Monthly cost for 20000 calls of 1200 input and 400 output tokens each, at list prices checked October 20, 2026:

- Claude Haiku 5.5: $6.40 a month ($0.00032 a call) Note: Up to 100K-token prompts; $0.50 / $2.50 beyond.
- Claude Haiku 5.5 (OpenRouter): $6.40 a month ($0.00032 a call)
- Gemini 3.8 Flash: $48.00 a month ($0.0024 a call) Note: Free tier available. $1.50 / $7.50 from 2027-01-01.
- Gemini 3.8 Flash (OpenRouter): $52.80 a month ($0.00264 a call)
- Claude Sonnet 5.5: $128.00 a month ($0.0064 a call)
- GPT-6.1 Sol: $128.00 a month ($0.0064 a call) Note: Above 272K input tokens: 2× input, 1.5× output.
- GPT-6.1 Sol (OpenRouter): $128.00 a month ($0.0064 a call)

Prices are in US dollars per million tokens, standard tier, without caching or batch discounts. Planner: https://thinkhard.si/tokens/
structuredContent, for code
{
  "checked": "October 20, 2026",
  "calls_per_month": 20000,
  "input_tokens": 1200,
  "output_tokens": 400,
  "models": [
    {
      "model": "Claude Haiku 5.5",
      "ref": "anthropic:claude-haiku-5-5",
      "per_call_usd": 0.00032,
      "monthly_usd": 6.4,
      "input_per_million": 0.1,
      "output_per_million": 0.5,
      "note": "Up to 100K-token prompts; $0.50 / $2.50 beyond."
    },
    {
      "model": "Claude Haiku 5.5 (OpenRouter)",
      "ref": "openrouter:anthropic/claude-haiku-5.5",
      "per_call_usd": 0.00032,
      "monthly_usd": 6.4,
      "input_per_million": 0.1,
      "output_per_million": 0.5,
      "note": ""
    },
    {
      "model": "Gemini 3.8 Flash",
      "ref": "google:gemini-3.8-flash",
      "per_call_usd": 0.0024,
      "monthly_usd": 48,
      "input_per_million": 0.75,
      "output_per_million": 3.75,
      "note": "Free tier available. $1.50 / $7.50 from 2027-01-01."
    },
    {
      "model": "Gemini 3.8 Flash (OpenRouter)",
      "ref": "openrouter:google/gemini-3.8-flash",
      "per_call_usd": 0.00264,
      "monthly_usd": 52.8,
      "input_per_million": 0.825,
      "output_per_million": 4.125,
      "note": ""
    },
    {
      "model": "Claude Sonnet 5.5",
      "ref": "anthropic:claude-sonnet-5-5",
      "per_call_usd": 0.0064,
      "monthly_usd": 128,
      "input_per_million": 2,
      "output_per_million": 10,
      "note": ""
    },
    {
      "model": "GPT-6.1 Sol",
      "ref": "openai:gpt-6.1-sol",
      "per_call_usd": 0.0064,
      "monthly_usd": 128,
      "input_per_million": 2,
      "output_per_million": 10,
      "note": "Above 272K input tokens: 2× input, 1.5× output."
    },
    {
      "model": "GPT-6.1 Sol (OpenRouter)",
      "ref": "openrouter:openai/gpt-6.1-sol",
      "per_call_usd": 0.0064,
      "monthly_usd": 128,
      "input_per_million": 2,
      "output_per_million": 10,
      "note": ""
    }
  ]
}

check_robot_speak

Local server onlyRead-only

Find what makes a text sound like AI

Check a draft for the habits that make writing read as AI-generated: long dashes, filler openings and sign-offs, flattery, AI-favorite words (delve, leverage, seamless), 'not just X but Y', teaser questions, lists of three, too much bold, emoji, same-length sentences, and the house rules you set (word limit, US or UK spelling, banned words). Returns each habit with the exact phrases, a version with the safe fixes applied, and standing instructions that stop the habits next time. It is not an AI detector. Runs on this machine.

Parameters

ParameterTypeWhat it is
textrequiredstringThe draft to check.
word_limitintegerOptional maximum number of words. At least 0.
spellingstringOne of: any (Any chat model), us, uk. Default "any".
banned_wordsarray of stringsOptional words that must never appear.
no_bulletsbooleanDefault false.
no_boldbooleanDefault false.
no_emojibooleanDefault true.
no_headingsbooleanDefault false.
no_exclamationbooleanDefault false.

Returns

A text answer for the AI to read, and structuredContent with these fields, matching the tool's outputSchema:

FieldTypeWhat it is
bandstringHow robotic it reads, in a word.
habitsintegerHabits found.
wordsinteger
per_100_wordsnumberHabits per 100 words.
findings[]array of objects
findings[].habitstring
findings[].countinteger
findings[].examples[]array of stringsUp to six of the exact phrases.
fixed_textstringThe text with the safe fixes applied.
instructionsstringStanding instructions that stop these habits next time.

Example

Example call, on the local server

{
  "text": "Certainly! Great question. In today's fast-paced world, it's important to delve into the data. Our new dashboard isn't just a report, it's a journey. I hope this helps!"
}

What the AI reads back

Robot-speak: 10 habits in 28 words (35.7 per 100 words).

Filler opening (2): It opens with a pleasantry instead of the point. People start with the answer.
  Found: "Certainly!", "Great question."
Exclamation marks (2): Several exclamation marks make a text sound like marketing copy.
  Found: "!"
Flattery (1): Praising the question or agreeing warmly before answering is a chatbot habit, and it makes the reply read as less sincere.
  Found: "Great question"
AI-favorite words (3): Words that AI models use far more often than people do. A plainer word usually says the same thing.
  Found: "In today's fast-paced world", "delve", "journey"
“Not just X, but Y” (1): Setting up a contrast nobody suggested (“not just a tool, but a partner”) is one of the most recognizable AI rhythms.
  Found: "isn't just"
Filler ending (1): It ends by offering more help, which nobody asked for and which marks the text as a chatbot reply.
  Found: "I hope this helps!"

With the safe fixes applied (dashes, filler openings and sign-offs, bold marks, emoji, spelling):
In today's fast-paced world, it's important to delve into the data. Our new dashboard isn't just a report, it's a journey.

Standing instructions to stop these habits next time:
Write like a thoughtful colleague, in plain, direct sentences.
Start with the answer itself. No opening pleasantries.
End when the content ends. Do not offer further help or invite questions.
Do not praise my questions or agree with me by default. If I am wrong, say so plainly.
Use plain, everyday words. Avoid: delve, leverage, robust, seamless, pivotal, crucial, foster, showcase, underscore, tapestry, landscape, realm, journey, elevate, unlock, furthermore, moreover.
Say what something is directly. Do not use the “not just X, but Y” or “it is not X, it is Y” patterns.
Do not use emoji.
Do not use exclamation marks.
structuredContent, for code
{
  "band": "Robot-speak",
  "habits": 10,
  "words": 28,
  "per_100_words": 35.71,
  "findings": [
    {
      "habit": "Filler opening",
      "count": 2,
      "examples": [
        "Certainly!",
        "Great question."
      ]
    },
    {
      "habit": "Exclamation marks",
      "count": 2,
      "examples": [
        "!"
      ]
    },
    {
      "habit": "Flattery",
      "count": 1,
      "examples": [
        "Great question"
      ]
    },
    {
      "habit": "AI-favorite words",
      "count": 3,
      "examples": [
        "In today's fast-paced world",
        "delve",
        "journey"
      ]
    },
    {
      "habit": "“Not just X, but Y”",
      "count": 1,
      "examples": [
        "isn't just"
      ]
    },
    {
      "habit": "Filler ending",
      "count": 1,
      "examples": [
        "I hope this helps!"
      ]
    }
  ],
  "fixed_text": "In today's fast-paced world, it's important to delve into the data. Our new dashboard isn't just a report, it's a journey.",
  "instructions": "Write like a thoughtful colleague, in plain, direct sentences.\nStart with the answer itself. No opening pleasantries.\nEnd when the content ends. Do not offer further help or invite questions.\nDo not praise my questions or agree with me by default. If I am wrong, say so plainly.\nUse plain, everyday words. Avoid: delve, leverage, robust, seamless, pivotal, crucial, foster, showcase, underscore, tapestry, landscape, realm, journey, elevate, unlock, furthermore, moreover.\nSay what something is directly. Do not use the “not just X, but Y” or “it is not X, it is Y” patterns.\nDo not use emoji.\nDo not use exclamation marks."
}

fact_check_list

Local server onlyRead-only

List the facts to check in an AI answer

Find every sentence in an AI answer that states something checkable (statistics, money, dates, quotes, named studies and sources, links, paper references, court cases, laws, people and titles, superlatives, vague authority) and list them riskiest first, with why each kind is often wrong and a search link for each. It never says whether a claim is true. Runs on this machine.

Parameters

ParameterTypeWhat it is
textrequiredstringThe AI answer to check.

Returns

A text answer for the AI to read, and structuredContent with these fields, matching the tool's outputSchema:

FieldTypeWhat it is
items[]array of objectsRiskiest first.
items[].sentencestring
items[].riskstringCheck first, Check, or Worth a look.
items[].kinds[]array of stringsWhat kinds of claim the sentence makes.
items[].details[]array of stringsThe exact numbers, names or quotes found.
items[].links[]array of objectsSearch links to check it.
items[].links[].labelstring
items[].links[].urlstring

Example

Example call, on the local server

{
  "text": "Remote work is here to stay. A 2023 Stanford study found remote workers were 13% more productive, and Gartner expects 48% of employees to work remotely by 2027. As Peter Drucker said, \"What gets measured gets managed.\""
}

What the AI reads back

2 things to check, riskiest first:

1. [Check first] As Peter Drucker said, "What gets measured gets managed."
   Quote: Quotes are often invented or put in the wrong person's mouth. Find where it was really said.
   Search for the quote: https://www.google.com/search?q=%22What%20gets%20measured%20gets%20managed.%22
2. [Worth checking] A 2023 Stanford study found remote workers were 13% more productive, and Gartner expects 48% of employees to work remotely by 2027.
   Date, Number: Statistics, money amounts and percentages are where AI is most often confidently wrong.
   Search the web: https://www.google.com/search?q=A%202023%20Stanford%20study%20found%20remote%20workers%20were%2013%25%20more%20productive%2C%20and%20Gartner%20expects%2048%25%20of%20employees%20to

Check each one against a source you trust before you use it. An AI with web search can verify them, but ask it for the source link for each.
structuredContent, for code
{
  "items": [
    {
      "sentence": "As Peter Drucker said, \"What gets measured gets managed.\"",
      "risk": "Check first",
      "kinds": [
        "Quote"
      ],
      "details": [
        "\"What gets measured gets managed.\""
      ],
      "links": [
        {
          "label": "Search for the quote",
          "url": "https://www.google.com/search?q=%22What%20gets%20measured%20gets%20managed.%22"
        }
      ]
    },
    {
      "sentence": "A 2023 Stanford study found remote workers were 13% more productive, and Gartner expects 48% of employees to work remotely by 2027.",
      "risk": "Worth checking",
      "kinds": [
        "Date",
        "Number"
      ],
      "details": [
        "2023",
        "13%",
        "48%",
        "by 2027"
      ],
      "links": [
        {
          "label": "Search the web",
          "url": "https://www.google.com/search?q=A%202023%20Stanford%20study%20found%20remote%20workers%20were%2013%25%20more%20productive%2C%20and%20Gartner%20expects%2048%25%20of%20employees%20to"
        }
      ]
    }
  ]
}

Prompts: prompts/list and prompts/get

Remote and local

Every template in the repository is also an MCP prompt. Its name is the template's slug, and its blanks are the arguments, all optional: a blank left out stays in the text as {{blank}} for the user to fill. Clients that support prompts show them as slash commands or in a menu.

  • prompts/list returns 100 prompts a page. Pass the nextCursor it gives you as cursor for the next page.
  • prompts/get takes name and arguments and returns one user message with the blanks you gave filled in.

Example call

curl -s https://thinkhard.si/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"prompts/get","params":{"name":"upset-customer-reply","arguments":{"company":"Northwind Bikes"}}}'

Answer

{
  "description": "Reply to an upset customer (SUP-001, thinkhard.si)",
  "messages": [
    {
      "role": "user",
      "content": {
        "type": "text",
        "text": "System prompt:\nYou are an experienced support lead at Northwind Bikes. You write replies to upset customers that calm the situation down: you stay specific, you take responsibility where the company got something wrong, and you never argue with how the customer feels.\n\nUser message:\n<policy>\n{{policy}}\n</policy>\n\n<account_facts>\n{{account_facts}}\n</account_facts>\n\n<customer_message>\n{{customer_message}}\n</customer_message>\n\nWrite a reply to the customer message above, for a support agent to review and send. The customer is upset. The goal is to fix the problem and keep them as a customer, so the reply should read as if one person took the complaint seriously.\n\nStructure the reply as three short paragraphs:\n1. Name what went wrong in the customer's terms and acknowledge the effect it had on them, in one or two sentences. If the account facts show we made a mistake, apologize once, for that specific mistake.\n2. Say exactly what we will do or have already done, using only actions the policy allows. If the customer has to do something, give numbered steps.\n3. Say what happens next, by when, and how to reach the same person again.\n\nKeep it under 170 words of plain text, with no headings or bullet points other than the steps, and sign it \"{{agent_name}}\".\n\nWrite in a warm, direct tone. Avoid stock phrases such as \"We apologize for any inconvenience\" or \"We value your feedback\", because upset customers read them as a brush-off. Do not dispute the customer's account of what happened, and do not offer refunds, credits or dates that the policy does not cover.\n\n<example>\nAn opening that works: \"You were charged twice this month and only found out when your card was declined somewhere else. That should not have happened, and I'm sorry.\"\n</example>\n\nIf anything is outside the policy, or the account facts do not confirm what the customer describes, do not decide it yourself. Leave it out of the reply and add a first line that starts with \"FOR THE AGENT:\" and says what needs a decision."
      }
    }
  ]
}

Errors

A tool that cannot do what was asked, such as grading an empty prompt, answers normally with isError: true and one sentence saying why, so the AI can tell the user. Problems with the request itself are JSON-RPC errors:

CodeWhen
-32700The body is not JSON (HTTP 400).
-32600The message is not JSON-RPC 2.0.
-32601The method does not exist.
-32602The tool or prompt name does not exist.
-32603Something went wrong on our side.
-32000Over 600 calls in an hour from one network (HTTP 429, with Retry-After).