Recommended Free Tools
To develop an MCP server for a web application, choose one application action or data source to expose, implement it with an SDK that matches your project language, and select a transport based on how the MCP host connects. For a local host that launches a process, start with stdio; for a remotely hosted server, the TypeScript server guide recommends Streamable HTTP. This guide follows the current TypeScript SDK v2 line and explains how to build and inspect a small local server without mixing in v1 APIs.
Decide what your web application should expose
Model Context Protocol (MCP) lets a client or host interact with server capabilities through three main primitives. Choose according to what the host should do, rather than exposing internal application structure wholesale:
| Primitive | Use it when | Example for a web application |
|---|---|---|
| Tool | The model should request an action or a specific operation. | Look up an order, create a draft, or retrieve a weather alert. |
| Resource | The client should read data addressed by a URI. | Expose a documented project record or a read-only application snapshot. |
| Prompt | The client should offer a reusable prompt template. | Provide a consistent template for summarizing a support case. |
A first server can expose one narrowly scoped tool. Add resources or prompts when their behavior fits the application better; these are distinct capabilities, not alternate names for tools. The official SDK documentation describes clients as listing and calling tools, reading resources, and retrieving prompts.
Choose an SDK and keep to one version line
Use the language already supported by the application and team, then follow that SDK’s own package names and API examples. The official TypeScript SDK v2 server package is an ES module package, requires Node.js 20 or later for the documented first-server setup, and implements the 2026-07-28 MCP specification. It replaces the older monolithic TypeScript v1 package, so code copied from older tutorials may not match.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11#1 Best Overall
| Choice | Documented baseline | Practical distinction |
|---|---|---|
| TypeScript SDK v2 | Node.js 20 or later; TypeScript project configured as an ES module. | The first-server guide uses @modelcontextprotocol/server, zod, and tsx. |
| Python SDK v2 | Python 3.10 or later. | The official docs use mcp[cli] for development and demonstrate FastMCP registration of tools, resources, and prompts. |
The SDKs have separate APIs and version histories. For Python, the documentation also distinguishes the v2 line from its v1 maintenance line. Do not combine TypeScript package instructions with Python examples or assume similarly named APIs behave identically.
Build a local TypeScript server with one tool
The following follows the TypeScript v2 first-server setup: an ES module project, a tool with an input schema, and stdio transport. Consult the official TypeScript SDK documentation for the current guide and API details before adopting it, since SDK requirements and names can change.
1. Create the project
With Node.js 20 or later and npm installed, create a directory, initialize it, and install the packages used by the official setup:
Rank #2
- HTML CSS Design and Build Web Sites
- Comes with secure packaging
- It can be a gift option
mkdir web-mcp-server
cd web-mcp-server
npm init -y
npm install @modelcontextprotocol/server zod
npm install --save-dev tsx typescript
Set the package to ES module mode and add a development script to package.json. Merge these properties into the generated file rather than replacing any other fields you need:
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →{
"type": "module",
"scripts": {
"dev": "tsx server.ts"
}
}
2. Register a narrowly scoped tool
Create server.ts. This example exposes a small lookup tool; replace its implementation with a deliberate call into your application. The handler should do only the operation described by the tool and should not silently perform unrelated writes.
import { z } from "zod";
import { McpServer } from "@modelcontextprotocol/server";
import { serveStdio } from "@modelcontextprotocol/server/stdio";
const server = new McpServer({
name: "web-app-tools",
version: "1.0.0",
});
server.registerTool(
"lookup_order",
{
title: "Look up an order",
description: "Find an order by its public order reference.",
inputSchema: {
orderReference: z.string().min(1).describe("Public order reference"),
},
},
async ({ orderReference }) => {
// Replace with a call to your application's authorized lookup function.
const order = await findOrderByReference(orderReference);
if (!order) {
return {
content: [{ type: "text", text: "No matching order was found." }],
};
}
return {
content: [{
type: "text",
text: JSON.stringify({
reference: order.reference,
status: order.status,
}),
}],
};
},
);
await serveStdio(() => server);
async function findOrderByReference(reference: string) {
// Demonstration placeholder implementation; connect your application here.
return reference === "DEMO-123"
? { reference, status: "processing" }
: null;
}
This code illustrates the v2 pattern documented for a server factory and serveStdio; verify exact imports and signatures against the current SDK guide when implementing. The zod schema defines the accepted input, including a non-empty string. The SDK validates calls against the declared schema and rejects invalid arguments before the handler runs. Keep tool names, descriptions, and schemas specific enough that a host can present the capability accurately.
Rank #3
3. Start it and preserve the protocol stream
Run the development script with npm run dev. With stdio, the host launches the server as a local child process and communicates over standard input and output. Do not use console.log for diagnostic output: stdout is reserved for protocol traffic, and extra text can corrupt communication. Send diagnostics to stderr, for example with console.error.
Select a transport for how the host connects
- Stdio: Use when a local MCP host launches your server process. The process lifetime belongs to that host connection, and JSON-RPC traffic travels over stdin and stdout.
- Streamable HTTP: For a remotely hosted TypeScript server, the TypeScript server guide recommends this transport. Consult the selected v2 SDK or framework documentation for its current setup and deployment details.
- HTTP+SSE: The TypeScript server guide retains it for backwards compatibility. Avoid starting a new remote implementation from a v1-only code sample without checking the current v2 or framework instructions.
The detailed TypeScript transport guidance cited here is from the SDK v1 server guide; it describes transport roles, but its code should not be treated as a v2 API recipe. Use the current versioned guide for implementation specifics.
Inspect and test the server locally
Before wiring the server into a full application host, verify that it starts, advertises the intended capability, accepts valid input, and handles invalid input without running the handler.
Rank #4
- Brand: Wiley
- Set of 2 Volumes
- A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers
- Start the server using the same command the host will launch, such as
npm run devduring development. - Launch MCP Inspector using the server command as described in the official TypeScript first-server guide.
- Use Inspector’s browser interface to connect, inspect the listed tool and schema, invoke a valid argument, and try an invalid argument.
- Confirm that diagnostics appear on stderr rather than mixed into stdout, then test against the real application boundary before exposing the server beyond local development.
The Python SDK provides a different documented path: its getting-started guide shows the mcp dev workflow and an in-memory Client for calling a tool without a subprocess or port. That is useful for programmatic Python tests; it is not a TypeScript API. The Python documentation says its examples are exercised by that SDK’s own test suite. These are documented workflows, not independent test results for your implementation.
Connect application behavior safely
An MCP tool is an interface to application behavior, so define its boundary before connecting credentials or production data. Schema validation helps reject malformed arguments, but it does not decide whether a caller is entitled to perform an operation. Keep permissions, data access, and side effects aligned with the application’s own authorization model, and describe consequential actions clearly to the host and user.
The TypeScript v1 server documentation also warns that localhost MCP servers can be vulnerable to DNS rebinding and describes host-header validation support for its Express helper. That is a specific documented concern, not a complete security checklist. For remote deployment, consult the chosen SDK, framework, and host documentation for authentication, authorization, network exposure, and operational controls.
Best Value
Troubleshoot common development failures
| Symptom | Likely cause | What to check |
|---|---|---|
| Host or Inspector cannot parse the server response. | Non-protocol output was written to stdout. | Remove console.log and other stdout logging; send diagnostics to stderr. |
| Tool call is rejected before application code runs. | Arguments do not satisfy the declared input schema. | Inspect the tool schema and provide all required fields in the expected types and formats. |
| Imports or examples do not match the installed package. | Instructions from TypeScript v1 and v2 were mixed, or the project is not configured as an ES module. | Check the installed package and follow the corresponding official versioned guide; confirm "type": "module". |
| Local server works, but a remote host cannot connect. | The server is using a local-process transport or a remote transport configured from an outdated example. | Choose stdio for a process-spawned local host; for a remote TypeScript server, use current Streamable HTTP guidance and deployment instructions. |
| Inspector cannot launch the server. | The command, working directory, runtime requirement, or startup script is incorrect. | Run the command directly in the project directory, confirm Node.js 20 or later for the documented TypeScript setup, and compare the Inspector launch configuration with the command that works locally. |
| Tool returns no useful result despite a valid call. | The sample handler or application lookup returns no matching data, or an application dependency failed. | Test the application function independently, handle the not-found case explicitly, and report errors without leaking secrets. |
Or skip the browser setup
If the web-development task is capturing a page rather than building browser automation yourself, ScreenshotNeo is a website screenshot API and MCP server. A single request returns a PNG, JPEG, WebP, or PDF, and its MCP tools let AI agents call take_screenshot, get_page_info, and capture_pdf. The API and MCP server solve a different problem from a custom application MCP server: use them when you need page capture, not as a substitute for your own application tools.
For an API call, create an account key and run this cURL example (replace the target URL if needed):
Quick Recap
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the ScreenshotNeo documentation for parameters and response details. Cookie banners, popups, and chat widgets are removed before the shot; bot checks, blank pages, and failed loads are never billed. It offers an MCP server for AI agents, and includes 1,000 screenshots a month free with no card; paid plans start at $5 for 3,000. Sign up for 1,000 free screenshots a month with no card.
Useful next steps
- Start with one tool whose name, description, schema, and effect are easy to explain.
- Use the SDK line matching your language and verify package names and API signatures against its current official guide.
- Choose stdio for a locally spawned process; choose the current remote transport guidance when clients connect over a network.
- Test capability discovery and both valid and invalid arguments before connecting a production host.
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

