<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: JohnnyZhang483</title><link>https://news.ycombinator.com/user?id=JohnnyZhang483</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 13 Jun 2026 12:59:07 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=JohnnyZhang483" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[Bad MCP design costs your agent 5x more tokens]]></title><description><![CDATA[
<p>I recently did some tests on two MCPs with identical functionalities. Turns out one of them has really bad performance. So I wanna share those bad MCP design patterns that cause this.<p>It all started when I wrote an MCP Server (MCP-A) for a to-do list app. Later, the app officially released its own MCP Server (MCP-B). Both MCPs have the same functionalities and hit the same backend API.<p>The experiment is set up as follows:<p>- Both MCP Servers connect to the same ToDo list account, and it will be reset after each test.
- 40 test prompts to simulate typical use cases for these MCPs.
- The test was conducted with the same model, system prompt, and Agent framework<p>Here are the results:<p>| Metric              | MCP-A       | MCP-B       | Gap   |
| ------------------- | ----------- | ----------- | ----- |
| Tool Desc Length    | 11,464      | 3,682       | —     |
| Pass Rate           | 36/40 (90%) | 36/40 (90%) | Same  |
| Total input tokens  | 637,244     | 3,174,329   | 4.98× |
| Total output tokens | 17,301      | 23,238      | 1.34× |
| Total Agent steps   | 122         | 157         | 1.29× |
| Total time          | 597s        | 676s        | 1.13× |<p>---<p>The result shows that MCP-B took 35 more ReAct loops to complete 40 test cases compared to MCP-A, which means 30% more output tokens. I examined the log and found that the root cause is poor query tool design.<p>Take the `search tool` for example, its job is to find a todo item in the ToDo list. In MCP-B, this tool returns this:<p>{
  "id": "6a1916b48f08cb3a4c857ed0",
  "title": "buy some groceries",
  "url": "https://todo.example.com/tasks/6a1916b48f08cb3a4c857ed0"
}<p>But other CRUD operations require `project_id`, and `search_tool` doesn't return it. So the Agent has to call another tool `get_task_by_id`. On the other hand, MCP-A's query_tasks returns all necessary info to perform the next action in a single call:<p>Task 1:
ID: 6a19143e8f084a8c8101612f
Title: buy some groceries
Project ID: 6a1914378f084a8c810160a9
Start Date: 2025-07-19 10:00:00
Priority: Medium
Status: Active
Unfiltered API Data was dumped into context window<p>If MCP returns pure API results to the Agent's context unprocessed, the Agent's context window will accumulate very fast.<p>Take MCP-B's `create_task` tool, for example. Its job is to create a to-do item. This is what this tool returns:<p>{
  "id": "6a180de78f086bdead0608be",
  "projectId": "inbox125587327",
  .....
  "createdTime": "2026-05-28T09:41:59+0000",
  "modifiedTime": "2026-05-28T09:41:59+0000",
  "focusSummaries": null
}<p>These 600+ characters mean nothing to the Agent's task, but are still dumped into the Agent's context. On the other hand, MCP-A's create_tasks does a layer of filtering and formatting. This little tweak makes a huge difference in input token usage.<p>Another issue is tool count. More tools mean a larger candidate set for the model to choose from, which directly increases decision difficulty. In MCP-A, 47 tools were compressed down to 14, covering the same functionality with fewer tools.<p>---<p>So here are my takeaways on good MCP tool design:
- When designing a tool, think about what the Agent will need next, not just what it's asking for right now. Return enough context in the result so the Agent can take the next action without making another round-trip.<p>- Too many tools will increase the model's decision burden. So it'd be better to minimize the number of tools within an MCP. Make sure they don't overlap functionalities.<p>- When your MCP returns data to the LLM, try to keep it LLM-friendly, which means readable. You can filter out unnecessary fields from the API response and format the data, rather than passing through raw JSON.<p>---<p>All the tests above were run by MCP-Eval. It's an MCP Server benchmarking tool. If you want to check your MCP's performance, feel free to check this out.<p>https://github.com/Code-MonkeyZhang/mcp-eval</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48407391">https://news.ycombinator.com/item?id=48407391</a></p>
<p>Points: 15</p>
<p># Comments: 1</p>
]]></description><pubDate>Fri, 05 Jun 2026 02:53:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=48407391</link><dc:creator>JohnnyZhang483</dc:creator><comments>https://news.ycombinator.com/item?id=48407391</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48407391</guid></item><item><title><![CDATA[Show HN: PromptCard – Quick prompt insert for ChatGPT web interface]]></title><description><![CDATA[
<p>I found myself constantly inputing similar prompts when using ChatGPT. I wanted a faster way to reuse and insert prompts without breaking my typing flow. And I also want a place to save & manage my frequently used prompts.<p>so I built PromptCard, a chrome extension to make prompt input faster and more comfortable. 
<a href="https://promptcard.online/" rel="nofollow">https://promptcard.online/</a><p>It works like this:
- In ChatGPT input box, you can enter #prompt_shortcut.
- When you hit send, the content from the selected prompt will be inserted to that place and sent to ChatGPT.<p>Example:
Let's say you want ChatGPT to help draft an email to your boss to request a day off. You might sent this:<p>"My son has fever and I need to stay home tomorrow to take care of him.  Please help me write a short, professional email to my manager. Write in a clear and professional tone suitable for workplace communication. Keep it polite, concise, and respectful."<p>If you saved the 2nd part above under #email_to_manager, the input will become:<p>"My son has a high fever and I need to stay home tomorrow to take care of him. #email_to_manager."<p>Notice that the prompt is much shorter, and #email_to_manager can be reused everytime you want to write email to manager. The extension also comes a website for prompts sharing and managemnt.<p>I would love to hear all the feedback/suggestions. Thanks!</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=44688740">https://news.ycombinator.com/item?id=44688740</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 25 Jul 2025 21:32:35 +0000</pubDate><link>https://promptcard.online/tutorial</link><dc:creator>JohnnyZhang483</dc:creator><comments>https://news.ycombinator.com/item?id=44688740</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44688740</guid></item></channel></rss>