Sample shop MCP server: paginated search, idempotent orders, guarded cancellation. Four languages.
Ready-to-clone examples that expose a REST API to ChatGPT, Claude and any other MCP client, written with the official Model Context Protocol SDKs for TypeScript, Python, C# and PHP. All four servers wrap the same small Sample Shop API and publish an identical set of four tools, and a conformance test proves it by running the same scenario against each of them in CI.
Maintained by API to Agents, which builds and hosts this kind of server for companies that would rather not. The examples are MIT licensed; use them as a starting point for your own API.
Every integration needs the same three kinds of tool, and every example here has them:
| Tool | Kind | What it demonstrates |
|---|---|---|
search_products | read | Pagination with an opaque nextCursor, summarised results instead of raw records, a description that tells the assistant when the list is incomplete |
get_product | read | Lookup by id, "not found" reported as an error that says not to retry |
create_order | write | Idempotency: the assistant generates a key and reuses it on retry, so a timeout never creates a duplicate order |
cancel_order | guarded | Refuses to act until called with confirm=true, after showing the user what will be cancelled |
Also shown in each: the upstream API key lives in the server's environment and is never visible to the assistant; errors distinguish invalid input, not found, conflict and upstream unavailable, each with a hint about what to do next; tools carry readOnlyHint, destructiveHint and idempotentHint annotations.
sample-api/ Zero-dependency Node server + openapi.json. Products, orders, idempotent create, cancel.
typescript/ @modelcontextprotocol/server 2.3 + express, Streamable HTTP, stateless
python/ mcp 2.3 (MCPServer), Streamable HTTP, stateless
csharp/ ModelContextProtocol.AspNetCore 2.2, .NET 10, Streamable HTTP, stateless
php/ mcp/sdk 0.8, PHP 8.2+, Streamable HTTP with a file session store
tests/ Conformance scenario (TypeScript client) run against each server in CI
Start the sample API once; it listens on 127.0.0.1:4010 and expects X-API-Key: demo-key.
node sample-api/server.mjs
Then start any server. Each reads UPSTREAM_URL (default http://127.0.0.1:4010) and UPSTREAM_API_KEY (default demo-key) from the environment.
# TypeScript — http://127.0.0.1:3001/mcp
cd typescript && npm ci && npm run build && npm start
# Python — http://127.0.0.1:3002/mcp
cd python && python -m venv .venv && .venv/bin/pip install -r requirements.txt && .venv/bin/python server.py
# C# — http://127.0.0.1:3003/mcp
cd csharp && dotnet run
# PHP — http://127.0.0.1:3004/mcp
cd php && composer install && php -S 127.0.0.1:3004 public/index.php
Run the conformance scenario against whichever one is up:
cd tests && npm ci && MCP_URL=http://127.0.0.1:3001/mcp npm test
Each server is a remote MCP server over Streamable HTTP at /mcp. For a client on another machine, expose it over HTTPS and point the client at that URL:
These examples use an API key on the upstream side only and no authentication on the MCP endpoint itself, which is fine on localhost and wrong on the internet. Before exposing one publicly, add bearer-token or OAuth protection at the endpoint; each SDK documents how.
sample-api/openapi.json with your API description and the shop client in your language of choice with calls to your endpoints.tests/conformance.mjs to your tools and run it against every change.Or run the free Agent Readiness Audit: it reads your documentation and proposes the tools, the boundaries and a fixed price for having it built and hosted.
MIT. See LICENSE.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @apitoagents/sample-shop-mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-apitoagents-sample-shop-mcp": {
"command": "npx",
"args": [
"-y",
"@apitoagents/sample-shop-mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceSample Shop MCP server works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.