# thinkhard.si MCP server

> A free, public MCP server with 319 expert prompt templates for work, a prompt grader and an AI price catalog. No key, no sign-in. Server version 1.1.0.

- Address: https://thinkhard.si/mcp (Streamable HTTP, stateless, JSON responses)
- Local edition (stdio, Node 18+): `npx -y --package=https://thinkhard.si/downloads/thinkhard-mcp.tgz thinkhard-mcp`
- Official MCP Registry name: `si.thinkhard/prompt-tools`
- Docs: https://thinkhard.si/developers/ (setup), https://thinkhard.si/developers/tools/ (this reference), https://thinkhard.si/developers/api/ (calling it from code)

## Add it

Claude Code:

```sh
claude mcp add --transport http thinkhard https://thinkhard.si/mcp
```

Cursor (`~/.cursor/mcp.json`) and most clients that take JSON:

```json
{
  "mcpServers": {
    "thinkhard": {
      "url": "https://thinkhard.si/mcp"
    }
  }
}
```

VS Code (`.vscode/mcp.json`):

```json
{
  "servers": {
    "thinkhard": {
      "type": "http",
      "url": "https://thinkhard.si/mcp"
    }
  }
}
```

Clients that only start local commands:

```json
{
  "mcpServers": {
    "thinkhard": {
      "command": "npx",
      "args": [
        "-y",
        "--package=https://thinkhard.si/downloads/thinkhard-mcp.tgz",
        "thinkhard-mcp"
      ]
    }
  }
}
```

## Tools

Every tool is read-only and idempotent. Each returns a text answer for the model and `structuredContent` matching its `outputSchema`.

### search_prompts

Search the prompt repository. Remote and local.

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:

- `query` (string, required): What the user wants to do, in plain words, for example "cover letter" or "summarize a long contract".
- `collection` (string): Limit to one collection (see list_collections). One of: `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).
- `model` (string): Only 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).
- `limit` (integer): Default `8`. From 1 to 25.

Returns (`structuredContent`):

- `prompts[]` (array of objects): Best match first. Empty when nothing matches.
- `prompts[].id` (string): Registry number, such as CAR-002.
- `prompts[].slug` (string): Pass it to get_prompt.
- `prompts[].title` (string)
- `prompts[].use` (string): When to use it.
- `prompts[].collection` (string): The collection it belongs to.
- `prompts[].laid_out_for` (string): The kind of model it is laid out for.
- `prompts[].score` (integer): Its own grade out of 10.
- `prompts[].url` (string): Its page on thinkhard.si.

Example arguments:

```json
{
  "query": "turn meeting notes into action items",
  "limit": 3
}
```

Text answer:

```text
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.
```

### get_prompt

Get a prompt template. Remote and local.

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:

- `prompt` (string, required): The slug, registry number or exact title from search_prompts.
- `values` (object of strings): Blank name → the user's text, for example {"job_posting": "..."}.

Returns (`structuredContent`):

- `id` (string): Registry number.
- `slug` (string)
- `title` (string)
- `system` (string): The system prompt, with the given values filled in. Empty when the template has none.
- `prompt` (string): The user message, with the given values filled in.
- `open_blanks[]` (array of strings): Blanks still to fill. Ask the user for these.
- `url` (string)

Example arguments:

```json
{
  "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."
  }
}
```

Text answer:

```text
# 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).
```

### list_collections

List the prompt collections. Remote and local.

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

Returns (`structuredContent`):

- `collections[]` (array of objects)
- `collections[].id` (string): Pass it to search_prompts as collection.
- `collections[].code` (string): Registry prefix, such as CAR.
- `collections[].name` (string)
- `collections[].blurb` (string)
- `collections[].count` (integer): Prompts in the collection.

Example arguments:

```json
{}
```

Text answer:

```text
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.
```

### grade_prompt

Grade a prompt out of 10. Remote and local.

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:

- `prompt` (string, required): The prompt to grade (the user message).
- `system` (string): Optional system prompt, graded together with the prompt.
- `target` (string): The 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 (`structuredContent`):

- `score` (integer): Out of 10.
- `band` (string): The score in a word.
- `target` (string): The model it was read for.
- `checks[]` (array of objects): The ten checks, in order.
- `checks[].check` (string)
- `checks[].pass` (boolean)

Example arguments:

```json
{
  "prompt": "Write a cover letter for a marketing job. Make it sound professional."
}
```

Text answer:

```text
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/
```

### estimate_ai_cost

Estimate what an AI feature costs. Remote and local.

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:

- `input_tokens` (integer): Input tokens per call. Omit to estimate from prompt_text. At least 0.
- `prompt_text` (string): The prompt, to estimate input tokens (about 4 characters a token).
- `output_tokens` (integer): Output tokens per call. Default `500`. At least 0.
- `calls_per_month` (integer): Default `1000`. At least 1.
- `models` (array of strings): Model names or ids to include, such as "Claude Sonnet 5.5". Default: every current model.

Returns (`structuredContent`):

- `checked` (string): When the prices were last checked against each provider.
- `calls_per_month` (integer)
- `input_tokens` (integer)
- `output_tokens` (integer)
- `models[]` (array of objects): Cheapest first.
- `models[].model` (string)
- `models[].ref` (string): Provider and model id.
- `models[].per_call_usd` (number): US dollars per call.
- `models[].monthly_usd` (number): US dollars a month.
- `models[].input_per_million` (number): US dollars per million input tokens.
- `models[].output_per_million` (number): US dollars per million output tokens.
- `models[].note` (string): Empty unless something about the price needs saying.

Example arguments:

```json
{
  "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"
  ]
}
```

Text answer:

```text
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/
```

### check_robot_speak

Find what makes a text sound like AI. Local server only.

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:

- `text` (string, required): The draft to check.
- `word_limit` (integer): Optional maximum number of words. At least 0.
- `spelling` (string): One of: `any` (Any chat model), `us`, `uk`. Default `"any"`.
- `banned_words` (array of strings): Optional words that must never appear.
- `no_bullets` (boolean): Default `false`.
- `no_bold` (boolean): Default `false`.
- `no_emoji` (boolean): Default `true`.
- `no_headings` (boolean): Default `false`.
- `no_exclamation` (boolean): Default `false`.

Returns (`structuredContent`):

- `band` (string): How robotic it reads, in a word.
- `habits` (integer): Habits found.
- `words` (integer)
- `per_100_words` (number): Habits per 100 words.
- `findings[]` (array of objects)
- `findings[].habit` (string)
- `findings[].count` (integer)
- `findings[].examples[]` (array of strings): Up to six of the exact phrases.
- `fixed_text` (string): The text with the safe fixes applied.
- `instructions` (string): Standing instructions that stop these habits next time.

Example arguments:

```json
{
  "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!"
}
```

Text answer:

```text
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.
```

### fact_check_list

List the facts to check in an AI answer. Local server only.

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:

- `text` (string, required): The AI answer to check.

Returns (`structuredContent`):

- `items[]` (array of objects): Riskiest first.
- `items[].sentence` (string)
- `items[].risk` (string): Check first, Check, or Worth a look.
- `items[].kinds[]` (array of strings): What kinds of claim the sentence makes.
- `items[].details[]` (array of strings): The exact numbers, names or quotes found.
- `items[].links[]` (array of objects): Search links to check it.
- `items[].links[].label` (string)
- `items[].links[].url` (string)

Example arguments:

```json
{
  "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.\""
}
```

Text answer:

```text
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.
```

## Prompts

Every template is an MCP prompt named by its slug, with its blanks as optional arguments. `prompts/list` pages 100 at a time (pass `nextCursor` back as `cursor`). `prompts/get` returns one user message with the given blanks filled in.

## Calling it over plain HTTP

POST one JSON-RPC 2.0 message to the address. There are no sessions, so `initialize` is optional for one-off calls. Send `Accept: application/json, text/event-stream`; answers are always `application/json`.

```sh
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."}}}'
```

## Limits and errors

- 600 calls an hour per network. Over that, HTTP 429 with `Retry-After`.
- JSON-RPC errors: -32700 parse error, -32600 invalid request, -32601 unknown method, -32602 unknown tool or prompt, -32603 internal error, -32000 too many requests.
- A tool that cannot do what was asked answers normally with `isError: true` and a sentence saying why.

## Privacy

Tool arguments are used to answer the call and are never stored or logged. thinkhard.si keeps a daily count of calls per tool, nothing else. The prompts are free to use in your work and your clients' work; do not republish the collection or sell it. https://thinkhard.si/terms/#repository
