LABSCO SUMMARY
The tool list is whatever the spec says, so you shape it with jq before the server ever starts.
That is the trick worth knowing: piping the spec through jq to keep one path means the assistant sees one tool instead of dozens, without a config format to learn. It is the fastest route to an MCP server for a service that does not have one — especially a service you are building yourself and already have a spec for.
What it is
A command-line tool that reads an OpenAPI specification and serves it as an MCP server, so any documented web API becomes tools an assistant can call.
What you get
- Tools generated from a spec's operations, with their input schemas, straight from a URL or a local file
- Authentication handled for you: --bearer-auth, --basic-auth and --raw-auth, each becoming the right Authorization header
- 1Password secret references in place of literal credentials, using op://vault/item/field with the op CLI signed in
- Rate and reliability controls — --rps to cap requests per second, --retries defaulting to 3, and --timeout defaulting to 1m0s
- Spec transformation through ordinary Unix tools: filter operations with jq before handing the spec over, so only the tools you want exist
- HTTP QUERY support per RFC 10008, including the x-query compatibility extension on older OpenAPI 3.x specs, registered as read-only and idempotent
- Stdio transport over JSON-RPC 2.0
Requirements
The binary — brew install mattt/tap/emcee, the installer script, a Docker image, or built from source with go 1.24 or later. Then one line of client config: the emcee command plus the spec URL. Note that credentials are not used when downloading a spec from a URL, so a spec behind auth has to be fetched yourself and passed as a local file. Only tools are provided — no resources, prompts or sampling.
Setup effort
One command — brew install mattt/tap/emcee
USE CASES
01
Using an API that has no MCP server
Hand emcee its OpenAPI spec and get tools without writing an integration.
02
Exposing only part of a large API
Filter the spec with jq so just the operations you want become tools.
03
Keeping a token out of your config file
Pass a 1Password secret reference instead of the literal credential.
04
Being a polite client of someone else's service
Cap requests per second and set a timeout so an eager agent does not hammer it.
BEFORE YOU INSTALL
What to know first
Requires
emcee on PATH
Where it runs
Both documented setups run the server on your machine.
INSTALLATION
Connect your client
Server setup
TERMINAL
brew install mattt/tap/emceeMCP Clients
Claude Desktop
CLAUDE DESKTOP · JSON
{
"mcpServers": {
"weather": {
"command": "emcee",
"args": [
"https://api.weather.gov/openapi.json"
]
}
}
}Claude Desktop — 1Password
CLAUDE DESKTOP — 1PASSWORD · JSON
{
"mcpServers": {
"twitter": {
"command": "emcee",
"args": [
"--bearer-auth=op://shared/x/credential",
"https://api.twitter.com/2/openapi.json"
]
}
}
}