Writing Your Own MCP Server
An MCP server exposes tools, data, or templates to any MCP-capable client โ from Claude Code to Antigravity.
Three building blocks
An MCP server offers a client like Claude Code or Antigravity three kinds of capability: Tools (functions the model actively calls, e.g. a database query), Resources (passive data like files or API responses that the application supplies), and Prompts (ready-made templates that users deliberately pick).
The minimal flow
A server runs as its own process and talks to the client over a fixed protocol (typically standard I/O or HTTP). On startup, the client calls tools/list, gets back a list of tool definitions with a JSON schema for the parameters, and calls tools/call with the right arguments when needed. So your server only has to: register tools with a name, description, and input schema, and return a result when called.
Official SDKs
The modelcontextprotocol organization maintains official SDKs for Python, TypeScript, Java, Kotlin, C#, Go, PHP, Ruby, Rust, and Swift โ you don't have to implement the protocol by hand.
Connecting to a client
A finished server gets registered in the client's configuration (e.g. mcpServers in Claude Code or mcp_config.json in Antigravity), usually with a command and arguments to start the server process. After that it shows up in the client's MCP manager, and its tools become available to the model.
EXAMPLE
A minimal Python server core (using the official SDK): an `@mcp.tool()` decorator registers a function `get_forecast(latitude, longitude)` as a tool โ the client discovers it automatically via `tools/list` and calls it when needed.
๐ ๏ธ EXERCISE โ TRY IT YOURSELF
Use an official MCP SDK (e.g. Python) to build a minimal server with exactly one tool, and connect it to an MCP-capable client.
- Install the official SDK for your language and create a server with a single tool (e.g. a function that returns the current date).
- Register the server in your client's MCP configuration (e.g. Claude Code or Antigravity) with a start command and arguments.
- Open your client's MCP manager (e.g. /mcp), check that the server is connected, and let the model call your tool.
โ SELF-CHECK
- โ Did the client discover your tool automatically via tools/list, without you registering it manually anywhere else?
- โ What happens if your server process (on STDIO transport) accidentally logs to stdout instead of stderr?
- โ Could you now connect the same server to a different MCP client without rewriting it?
QUICK QUIZ
What's the difference between an MCP "Tool" and an MCP "Resource"?
SOURCES
- MCP Docs: Build an MCP server โ modelcontextprotocol.io
- MCP Docs: Understanding MCP servers (Tools/Resources/Prompts) โ modelcontextprotocol.io
- GitHub: modelcontextprotocol organization (official SDKs) โ github.com