Creating MCP Tools
Project Structure
my-tool/
├── package.json ← name, version, entry point
├── server.js ← MCP server entry point
├── mcpm.json ← client config (recommended)
└── README.md ← documentation
mcpm.json — Client Configuration
The mcpm.json file maps directly to the mcpServers entry that users paste into their AI client config (Claude Desktop, Cursor, Windsurf, etc.):
<span class="hljs-punctuation">{</span>
<span class="hljs-attr">"mcp"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">"transport"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"stdio"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"command"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"node"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"args"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">"server.js"</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"env"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
| Field |
Purpose |
transport |
Almost always "stdio" for local servers |
command |
How to run your server — node, python, uv, etc. |
args |
Arguments for the command (e.g., ["server.js"]) |
env |
Environment variables like API keys |
This is the exact structure that appears under mcpServers.<name> in claude_desktop_config.json and similar client config files. When users install your tool, this config is what they copy-paste.
Defining Tools
<span class="hljs-keyword">const</span> tools = [{
<span class="hljs-attr">name</span>: <span class="hljs-string">"greet"</span>,
<span class="hljs-attr">description</span>: <span class="hljs-string">"Greet someone"</span>,
<span class="hljs-attr">parameters</span>: { <span class="hljs-attr">name</span>: { <span class="hljs-attr">type</span>: <span class="hljs-string">"string"</span> } },
<span class="hljs-attr">handler</span>: <span class="hljs-title function_">async</span> ({ name }) => ({ <span class="hljs-attr">message</span>: <span class="hljs-string">`Hello <span class="hljs-subst">${name}</span>!`</span> })
}];
Creating MCP Tools
Project Structure
mcpm.json — Client Configuration
The
mcpm.jsonfile maps directly to themcpServersentry that users paste into their AI client config (Claude Desktop, Cursor, Windsurf, etc.):<span class="hljs-punctuation">{</span> <span class="hljs-attr">"mcp"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span> <span class="hljs-attr">"transport"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"stdio"</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">"command"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"node"</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">"args"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">"server.js"</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">"env"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><span class="hljs-punctuation">}</span> <span class="hljs-punctuation">}</span> <span class="hljs-punctuation">}</span>transport"stdio"for local serverscommandnode,python,uv, etc.args["server.js"])envThis is the exact structure that appears under
mcpServers.<name>inclaude_desktop_config.jsonand similar client config files. When users install your tool, this config is what they copy-paste.Defining Tools
<span class="hljs-keyword">const</span> tools = [{ <span class="hljs-attr">name</span>: <span class="hljs-string">"greet"</span>, <span class="hljs-attr">description</span>: <span class="hljs-string">"Greet someone"</span>, <span class="hljs-attr">parameters</span>: { <span class="hljs-attr">name</span>: { <span class="hljs-attr">type</span>: <span class="hljs-string">"string"</span> } }, <span class="hljs-attr">handler</span>: <span class="hljs-title function_">async</span> ({ name }) => ({ <span class="hljs-attr">message</span>: <span class="hljs-string">`Hello <span class="hljs-subst">${name}</span>!`</span> }) }];