MCP Server Tools
The MCP (Model Context Protocol) Server handler supports tools, enabling you to expose your API routes as executable functions that AI clients can call to perform actions or retrieve data.
Tools are the core building block of MCP servers, allowing AI systems to interact with your services and discover capabilities through your Zuplo gateway.
Overview
Zuplo's MCP tools work by automatically transforming your API routes into MCP tool definitions. When an AI client calls a tool, the MCP server invokes the corresponding route handler in your gateway.
This means any existing API route can be instantly turned into an MCP tool with minimal configuration.
Configuration
Route Configuration
Configure a route in your OpenAPI doc:
Code
To provide MCP specific metadata for the tool, use the mcp property within
x-zuplo-route:
The x-zuplo-route.mcp configuration for tools supports:
type(string: optional, defaults totool) - Set to"tool"to denote this operation is an MCP tool.name(string: optional) - The identifier for the MCP tool. Defaults to the operation'soperationId. If theoperationIdis not set, falls back to an auto-generated name.description(string: optional) - Description of what the tool does. Falls back to the operation'sdescriptionorsummary. If the route'sdescriptionorsummaryfields are not set, falls back to an auto-generated description.enabled(boolean: optional) - Whether this tool is enabled. Defaults totrue.annotations(object: optional) - An object containing tool annotations:title(string: optional) - A human-readable title for the tool, often used by clients.readOnlyHint(boolean: optional) - Hint that the tool is read-only.destructiveHint(boolean: optional) - Hint that the tool has mutating side effects.idempotentHint(boolean: optional) - Hint that the tool is idempotent.openWorldHint(boolean: optional) - Hint that the tool operates in an open-world context of external entities (like web-search).
_meta(object: optional) - An object containing any arbitrary metadata.
The route handler for your tool can be any standard Zuplo request handler like the URL Forwarder or the Redirect handler or a custom function module. The route receives the request triggered by the MCP tool call within the gateway and returns a response that will be passed back through the MCP server to the AI client.
POST routes with a requestBody and a defined schema are translated into an
MCP tool's parameters. When invoked, these are validated by the MCP server to
ensure the tool is being correctly used by the LLM.
Other methods like GET, DELETE, etc. work in a similar fashion in order to
support complex tools in the shape of your APIs.
MCP Server Handler Configuration
Add tool configuration to your MCP Server handler options using the operations
array:
Code
See further details in the MCP Server Handler documentation.
Tool input schemas
Zuplo derives each tool's inputSchema from the operation's OpenAPI definition
and advertises it as a single flat object. The request body's properties and the
operation's path, query, and header parameters all become top-level tool
arguments, which is the shape MCP clients send on a first call.
When a client calls the tool, the gateway routes each argument back to the channel it came from, so a body field lands in the request body and a query parameter lands in the URL.
The weather route above declares one required query parameter, so its tool takes one required argument:
Code
A request body works the same way — its fields are the tool's arguments. Given this operation:
Code
The tool advertises the body's fields directly:
Code
And a call passes them at the top level:
Code
Parameters declared with in: cookie aren't exposed as tool arguments.
Undeclared arguments
Your own OpenAPI schema decides whether an argument the tool doesn't declare is rejected:
- The schema sets
additionalProperties: false. The tool's flat schema is closed too, and an undeclared argument fails with JSON-RPC error-32602. - The schema omits
additionalProperties. JSON Schema permits extras, so the tool accepts the argument and forwards it in the request body.
Set additionalProperties: false on a request body schema when you want the
gateway to reject fields a model invented rather than pass them upstream.
An argument routes to a request header only when a header parameter declares that exact name. An undeclared argument never becomes an upstream header.
When arguments stay nested
Some operations can't be flattened without changing what the tool accepts. Those tools keep the nested shape, and the MCP server logs the reason when it registers the tool:
- Two channels declare the same name. A
limitquery parameter alongside alimitbody field, for example. The whole schema stays nested and the server logs a warning. Rename one of them to get flat arguments. - The request body isn't a plain object. An array, a string, or a body built
from
oneOf,anyOf, orallOfhas no property names to hoist. Neither does one that constrains the object as a whole, throughminProperties,patternProperties, ordependentRequired. The parameters still flatten and the body keeps its ownbodyargument. EnabledebugModeto see which tools this applies to.
A nested schema wraps each channel the operation declares in its own object:
Code
The channel names are body, queryParams, pathParams, and headers. Only
the channels the operation declares appear.
Calling a tool with nested arguments
Flat tools also accept the nested form, so a client written against the nested schema keeps working:
Code
Send flat arguments in new clients — that's what the tool advertises.
To make every generated tool advertise the nested shape instead, set
toolInputStyle: "nested" in the
handler options.
Prompts don't use input channels. A prompt's arguments come
from its request body schema directly, so prompts/get always takes them at the
top level.
Testing MCP Tools
List Available Tools
Use the MCP tools/list method to see available tools:
Code
Response:
Code
Call a Tool
Use the MCP tools/call method to execute a tool:
Code
Response:
Code
Best Practices
Meaningful Names and Descriptions
Always set meaningful operationIds (like get_users, create_new_deployment,
or update_shopping_cart) and descriptions as these help LLMs understand
exactly what each tool does.
When you need to provide more meaningful descriptions or names that don't align
well with the operationId, set the metadata in x-zuplo-route.mcp.
Read more about authoring usable tools and good prompt engineering practices with Anthropic's Prompt engineering overview.
AI models rely heavily on tool descriptions to understand when and how to use a tool.
- Be Descriptive: Explain exactly what the tool does and what inputs it expects.
- Use Meaningful Names: Operation IDs like
create_userorsearch_productsare much better thanop1orendpoint.
Schema Design
Use descriptive and well-structured JSON schemas for your tools (in your OpenAPI
requestBody and response). This is used by the server to validate MCP client
inputs (that is, JSON generated by an LLM). Providing descriptive schemas
ensures an MCP Client's LLM always has the appropriate context on exactly what
arguments to provide to tools and can dramatically reduce invalid tool usage.
This validation is done automatically.
Code
Code
Defining clear schemas in your OpenAPI document ensures your handler always receives valid data. The MCP server uses these schemas to validate arguments provided by the AI client before your handler is ever called. Input validation is an important part of MCP, so ensure you have strong validation in your OpenAPI JSON schemas!
Custom Tools
For complex workflows that don't map 1:1 to a single API route, or require advanced logic, consider using Custom MCP Tools.