Products / AI Developer Tools
McpForge
TypeScript MCP server starter for Cursor & Claude Desktop
TypeScript MCP server starter over stdio with echo, fetch_url (guards), and notes_fs sandbox tools — fork, rename, extend.
Value
Problem. Shipping a custom MCP server means wrestling SDK wiring, stdio rules, and sandbox mistakes before Cursor/Claude Desktop ever see a tool.
How it helps. TypeScript MCP server starter over stdio with echo, fetch_url (guards), and notes_fs sandbox tools — fork, rename, extend.
Why buy. Save an afternoon of MCP SDK + Cursor JSON + path guards; own a minimal server that hosts already expect.
- Official @modelcontextprotocol/sdk + stdio transport
- Sample tools: echo, fetch_url, notes_fs
- Private-host / size guards on fetch; path sandbox for notes
How it works
flowchart LR
Host["Cursor / Claude Desktop"] -->|stdio JSON-RPC| Server["McpForge"]
Server --> Echo["echo"]
Server --> Fetch["fetch_url"]
Server --> Notes["notes_fs ./notes"]
Mermaid flowchart (render in GitHub / VS Code / mermaid.live).
Use case
From Cursor, call notes_fs write ideas.md then echo to confirm the MCP server is live.
What you get
- McpServer wiring in src/server.ts
- Three sample tools + Vitest (20 tests)
- Cursor / Claude Desktop config snippets in README
- MIT license
Project structure
mcpforge/
src/
index.ts, server.ts
tools/ echo, fetchUrl, notesFs
lib/ sandbox, fetchGuards, textResult
tests/ notes/
Quick start
npm install && npm test && npm run build
Point Cursor mcp.json command to dist/index.js (absolute path)
Restart Cursor — tools: echo, fetch_url, notes_fs
Example
From src/tools/echo.ts
// Register with server.registerTool(...)
// echo: { message, uppercase? } → text result
// Keep handlers pure; inject deps for Vitest.
Tested
20 Vitest tests — sandbox, echo, notes_fs CRUD, fetchUrl guards (injected fetch), server registration smoke.
npm test
2026-09-20 — 20 passed; npm run build OK
Design decisions
- Log only to stderr — stdout is the MCP protocol channel
- Pure tool handlers with injected fetch/notesRoot for offline tests
- Block localhost/private IPs in fetch_url by default
Limitations
- Not a hosted MCP cloud
- stdio only in the starter (no HTTP transport sample)
- fetch_url is GET-oriented with guards — not a general browser
- You must use absolute paths in host MCP config
Who it’s for
Developers connecting custom tools to Cursor or Claude Desktop.
Not for: Anyone wanting a managed multi-tenant MCP hosting product.
What you own
Full MIT-licensed TypeScript source via Gumroad ZIP. Fork it, ship it commercially, keep the license notice. You are responsible for secrets, hardening, and production ops.
Related
Demo