MCP Catalog
MCP (Model Context Protocol) is an open standard that defines how LLMs discover and invoke external tools through a uniform interface. Instead of hard-coding integrations, mini-a connects to MCP servers that expose capabilities as callable tools. Each MCP server runs as a separate process (STDIO) or remote service (HTTP), and mini-a automatically discovers available tools at startup.
mini-a ships with 29 built-in MCP servers covering a wide range of tasks. Load any combination of them with the mcp parameter, or aggregate them behind mcpproxy=true when you want to keep the exposed tool surface small.
Summary
| Server | Description | Type | Key Tools |
|---|---|---|---|
mcp-time |
Time and timezone operations | STDIO | getCurrentTime, convertTimezone |
mcp-db |
Database queries and schema | STDIO | query, listTables, describeTable |
mcp-file |
File system operations | STDIO | readFile, writeFile, listDir |
mcp-web |
Web browsing, search, and HTTP requests | STDIO | web-search, get-url, http-request |
mcp-shell |
Shell command execution | STDIO | execute, script |
mcp-ssh |
Remote SSH operations | STDIO | connect, execute, transfer |
mcp-s3 |
AWS S3 operations | STDIO | listBuckets, getObject, putObject |
mcp-net |
Network utilities | STDIO | ping, traceroute, dns, httpRequest |
mcp-fin |
Financial data | STDIO | stockPrice, exchangeRate, cryptoPrice |
mcp-rss |
RSS feed reader | STDIO | fetchFeed, listEntries |
mcp-email |
Email operations | STDIO | send, read, listInbox |
mcp-kube |
Kubernetes operations | STDIO | getPods, getLogs, describe |
mcp-math |
Mathematical operations | STDIO | calculate, statistics, convert |
mcp-random |
Random data generation | STDIO | uuid, number, string, pick |
mcp-telco |
Telecom utilities | STDIO | parseNumber, validate, lookup |
mcp-weather |
Weather information | STDIO | current, forecast |
mcp-ch |
ClickHouse database | STDIO | query, listTables |
mcp-es-search |
ElasticSearch/OpenSearch full-text search | STDIO/HTTP | search, get, read, info |
mcp-mini-a |
Spawn sub-agents | STDIO | delegate, status |
mcp-a2a |
Bridge external A2A-protocol agents as tools | STDIO/HTTP | a2a-agents, a2a-task |
mcp-proxy |
MCP proxy/aggregator | STDIO | aggregate, route |
mcp-pass |
MCP passthrough combiner | STDIO/HTTP | downstream tools forwarded directly |
mcp-oaf |
OpenAF utilities | STDIO | oafp, ow.format |
mcp-oafp |
OpenAF processor | STDIO | process, transform |
mcp-oaf-browse |
Generic browse over the oJob-common HTTP Browse API | STDIO/HTTP | list, get, search |
mcp-office |
Office document processing | STDIO | readExcel, readWord, readPDF |
mcp-ollama-web-search |
Web search via Ollama API | STDIO/HTTP | web-search |
mcp-wiki |
Persistent Markdown wiki knowledge base | STDIO/HTTP | list, read, search, lint, write |
mcp-wiki-ops |
Wiki maintenance and editing operations | STDIO/HTTP | edit, maintain, reindex |
Server Details
mcp-time
Time and timezone operations. Get current time in any timezone and convert between timezones.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-time.yaml')" goal='What time is it in all major timezones?'
Tools: getCurrentTime, convertTimezone, listTimezones
mcp-db
Query relational databases, inspect schemas, and list tables. Supports JDBC-compatible databases including H2, PostgreSQL, MySQL, and Oracle.
Configuration:
| Argument | Description |
|---|---|
jdbcUrl |
JDBC connection URL |
jdbcUser |
Database username |
jdbcPass |
Database password |
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-db.yaml')" goal='List all tables and describe their schemas'
Tools: query, listTables, describeTable, listSchemas
mcp-file
Read, write, and manage files and directories on the local filesystem. Supports text and binary operations.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-file.yaml')" goal='Read all JSON files in /tmp and summarize their contents'
Tools: readFile, writeFile, listDir, fileInfo, deleteFile, copyFile
mcp-web
Web browsing, search, and HTTP request utilities. Perform web searches, fetch/process URLs, and make REST calls.
Configuration:
| Argument | Description |
|---|---|
readwrite |
If true, enables mutating http-request methods (POST, PUT, PATCH, DELETE). Read-only mode allows GET and HEAD. |
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-web.yaml')" goal='Search for the latest OpenAF release and summarize the changelog'
Tools: web-search, get-url, http-request
mcp-shell
Execute shell commands and scripts on the host system. Provides direct access to the operating system command line.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-shell.yaml')" goal='Check disk usage and list the top 10 largest files'
Tools: execute, script, background
mcp-ssh
Connect to remote hosts via SSH. Execute commands, transfer files, and manage remote sessions.
Configuration:
| Argument | Description |
|---|---|
host |
Remote hostname or IP |
user |
SSH username |
key |
Path to private key file |
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-ssh.yaml')" goal='Connect to server1 and check system uptime'
Tools: connect, execute, transfer, tunnel
mcp-s3
Interact with AWS S3-compatible object storage. List buckets, upload and download objects, and manage permissions.
Configuration:
| Argument | Description |
|---|---|
accessKey |
AWS access key ID |
secretKey |
AWS secret access key |
region |
AWS region (default: us-east-1) |
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-s3.yaml')" goal='List all buckets and show the 5 most recent objects in each'
Tools: listBuckets, listObjects, getObject, putObject, deleteObject
mcp-net
Network diagnostic and utility tools. Perform connectivity tests, DNS lookups, and HTTP requests.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-net.yaml')" goal='Check if google.com is reachable and show DNS resolution details'
Tools: ping, traceroute, dns, httpRequest, portScan
mcp-fin
Retrieve financial market data including stock prices, exchange rates, and cryptocurrency values.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-fin.yaml')" goal='Get the current price of AAPL, GOOGL, and BTC-USD'
Tools: stockPrice, exchangeRate, cryptoPrice, marketSummary
mcp-rss
Read and parse RSS and Atom feeds. Retrieve entries, filter by date, and extract content.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-rss.yaml')" goal='Fetch the latest 5 entries from the OpenAF blog RSS feed'
Tools: fetchFeed, listEntries, searchEntries
mcp-email
Send and read emails. Supports SMTP for sending and IMAP for reading.
Configuration:
| Argument | Description |
|---|---|
smtpHost |
SMTP server hostname |
smtpPort |
SMTP server port |
imapHost |
IMAP server hostname |
emailUser |
Email account username |
emailPass |
Email account password |
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-email.yaml')" goal='Check my inbox for unread messages and summarize them'
Tools: send, read, listInbox, searchMessages
mcp-kube
Interact with Kubernetes clusters. List pods, view logs, describe resources, and manage deployments.
Configuration:
| Argument | Description |
|---|---|
kubeconfig |
Path to kubeconfig file |
namespace |
Default namespace |
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-kube.yaml')" goal='List all pods in the default namespace and show any that are not running'
Tools: getPods, getLogs, describe, getServices, getDeployments
mcp-math
Perform mathematical calculations, statistical analysis, and unit conversions.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-math.yaml')" goal='Calculate the standard deviation of [12, 15, 18, 22, 25, 30]'
Tools: calculate, statistics, convert, matrix
mcp-random
Generate random data including UUIDs, numbers, strings, and selections from lists.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-random.yaml')" goal='Generate 5 UUIDs and 3 random passwords of 16 characters'
Tools: uuid, number, string, pick, shuffle
mcp-telco
Telecom utilities for parsing, validating, and looking up phone numbers across international formats.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-telco.yaml')" goal='Parse and validate the phone number +1-555-123-4567'
Tools: parseNumber, validate, lookup, format
mcp-weather
Retrieve current weather conditions and forecasts for any location.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-weather.yaml')" goal='What is the weather forecast for Lisbon this week?'
Tools: current, forecast, alerts
mcp-ch
Connect to ClickHouse databases for analytical queries and schema inspection.
Configuration:
| Argument | Description |
|---|---|
chUrl |
ClickHouse server URL |
chUser |
ClickHouse username |
chPass |
ClickHouse password |
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-ch.yaml')" goal='List all tables in the default database and show row counts'
Tools: query, listTables, describeTable
mcp-es-search
LLM-optimised full-text search over an ElasticSearch or OpenSearch index. Tools are designed for retrieval workflows: search first, then fetch or read specific documents.
Configuration:
| Argument | Description |
|---|---|
url |
ElasticSearch/OpenSearch base URL (required) |
index |
Default index to search (required) |
contentField |
Field holding the document full text (default: content) |
pathField |
Field holding the source file path (default: path) |
titleField |
Field holding the document title (default: title) |
toolPrefix |
Optional prefix for tool names (e.g. docs- → docs-search, docs-get, …) |
label |
Human-readable label injected into tool descriptions |
user / password |
Optional HTTP Basic auth credentials |
onport |
Start an HTTP MCP server on this port instead of STDIO |
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-es-search.yaml url=http://localhost:9200 index=docs label=Documentation')" \
goal='Search the docs index for authentication examples'
Run multiple instances side by side (one per index) using toolPrefix to keep tool names distinct.
Tools: search, get, read, info
mcp-mini-a
Spawn sub-agents to handle delegated tasks. The parent agent can assign goals to child mini-a instances and monitor their progress.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-mini-a.yaml')" goal='Research three topics in parallel and combine the results'
Tools: delegate, status, cancel
mcp-a2a
Bridge external Google A2A-protocol agents into mini-a as MCP tools. At startup it fetches each agent’s Agent Card (/.well-known/agent.json), registers its skills, and routes calls via JSON-RPC 2.0 (tasks/send + tasks/get polling) until the task reaches a terminal state.
Configuration:
| Argument | Description |
|---|---|
agents |
Comma-separated base URLs of A2A agents to connect to (required) |
apitoken |
Optional Bearer token sent with every A2A HTTP request |
pollinterval |
Polling interval in ms while awaiting task completion (default: 1000) |
timeout |
Default task timeout in seconds (default: 120) |
serverdesc |
Optional JSON/SLON map overriding the exposed MCP server identity |
onport |
Start an HTTP MCP server on this port instead of STDIO |
Usage:
# Give mini-a access to two external A2A agents
mini-a usetools=true \
mcp="(cmd: 'ojob mcps/mcp-a2a.yaml agents=http://analyst:9000,http://writer:9000')" \
goal='Ask the data-analyst agent to summarize last quarter sales'
# Standalone HTTP bridge
ojob mcps/mcp-a2a.yaml agents="http://agent1:9000,http://agent2:9000" onport=8888
Tools: a2a-agents (list registered agents and skills), a2a-task (send a task and await the result)
mcp-proxy
Aggregate and route requests across multiple MCP servers. Acts as a single entry point that proxies tool calls to the appropriate backend server.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-proxy.yaml')" goal='Use time and math tools through the proxy'
Tools: aggregate, route, listServers
mcp-pass
Combine one primary MCP server with zero or more additional MCP servers and republish the merged tool set through a single MCP endpoint. Unlike mcp-proxy, mcp-pass forwards the downstream tools directly, so clients see the merged tools as native tools instead of going through a dispatcher tool.
Configuration:
| Argument | Description |
|---|---|
mainmcp |
Required primary MCP connection descriptor |
othermcps |
Optional array of extra MCP connection descriptors to merge |
includeTool |
Optional comma-separated list of tools to expose |
excludeTool |
Optional comma-separated list of tools to hide |
useprefix |
Optional comma-separated prefixes applied per connection order to avoid name collisions |
serverdesc |
Optional server metadata override for the exposed MCP identity |
onport |
If set, runs as an HTTP MCP server instead of STDIO |
uri |
Custom HTTP route prefix when using onport |
usesse |
If true, HTTP responses are returned as SSE events |
Best for:
- Exposing several MCP servers as one endpoint when the client expects a single MCP connection
- Adding local helper tools to an existing remote MCP without changing the remote server
- Publishing only a curated subset of tools from a larger tool estate
- Avoiding tool-name collisions by prefixing tools per upstream connection
- Passing HTTP request headers through to downstream MCP calls when auth or tenant context matters
Usage:
ojob mcps/mcp-pass.yaml onport=9091 \
mainmcp="(type: remote, url: 'http://localhost:8080/mcp')" \
othermcps="[(cmd: 'ojob mcps/mcp-time.yaml'), (cmd: 'ojob mcps/mcp-random.yaml')]"
ojob mcps/mcp-pass.yaml onport=9091 uri=/mcp usesse=true \
mainmcp="(type: remote, url: 'http://localhost:8080/mcp')" \
othermcps="[(cmd: 'ojob mcps/mcp-time.yaml'), (cmd: 'ojob mcps/mcp-random.yaml')]" \
useprefix="core-,time-,rand-" \
excludeTool="rand-pick"
Returning TOON instead of JSON:
OpenAF’s MCP server helpers honor the MCPSERVER.answerInTOON runtime flag. When set, tool results are serialized as TOON (Token-Oriented Object Notation) text instead of JSON — typically 30–50% fewer tokens for tabular/structured payloads. Because STDIO MCPs launched by mcp-pass inherit the environment, setting the flag once turns the whole passthrough into a TOON gateway:
OAF_FLAGS="(MCPSERVER: (answerInTOON: true))" \
ojob mcps/mcp-pass.yaml onport=9091 uri=/mcp \
mainmcp="(cmd: 'ojob mcps/mcp-web.yaml')" \
othermcps="[(cmd: 'ojob mcps/mcp-time.yaml')]"
The downstream STDIO servers emit TOON tool results and mcp-pass forwards them verbatim to the client. For remote downstream MCPs, set the flag on those servers instead — mcp-pass does not re-encode content produced elsewhere.
When to choose mcp-pass vs mcp-proxy:
- Use
mcp-passwhen you want the merged tools to appear directly to the client. - Use
mcp-proxywhen you want an explicit proxy or dispatcher layer in front of multiple MCP backends.
See Deploying MCP Servers in Docker & Kubernetes below for running mcp-pass as a containerized gateway.
mcp-oaf
Access OpenAF utilities and formatting functions directly as MCP tools. Useful for data processing and transformation within the OpenAF ecosystem.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-oaf.yaml')" goal='Format this JSON data as a markdown table'
Tools: oafp, ow.format, ow.obj
mcp-oafp
OpenAF processor for data transformation pipelines. Process, filter, and transform structured data using oafp commands.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-oafp.yaml')" goal='Process this CSV file and output the top 10 rows sorted by revenue'
Tools: process, transform, filter, sort
mcp-oaf-browse
Generic browse server backed by the oJob-common HTTP Browse API. Exposes any Browse API endpoint (file listings, data catalogs, etc.) as list/get/search MCP tools.
Configuration:
| Argument | Description |
|---|---|
browseAPIURL |
Base URL of an HTTP Browse API endpoint (required) |
browseUri |
Target browse URI exposed by the Browse API (required) |
label |
Human-readable label injected into tool descriptions |
toolPrefix |
Optional prefix for tool names (e.g. files- → files-list, files-get, …) |
headers |
Optional HTTP headers map sent on every Browse API request |
defaultParams |
Optional query parameters map merged into every request |
onport |
Start an HTTP MCP server on this port instead of STDIO |
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-oaf-browse.yaml browseAPIURL=http://127.0.0.1:8091/api/browse browseUri=/files label=\"Local files\"')" \
goal='List the available files and read the most recent one'
Tools: list, get, search
mcp-office
Read and extract content from Microsoft Office documents and PDFs. Supports Excel spreadsheets, Word documents, and PDF files.
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-office.yaml')" goal='Read the Excel file report.xlsx and summarize the data in Sheet1'
Tools: readExcel, readWord, readPDF, listSheets
mcp-ollama-web-search
Web search through Ollama’s web_search API endpoint. Requires an Ollama API key.
Configuration:
| Argument | Description |
|---|---|
apiKey |
Ollama API key (or set OLLAMA_API_KEY env var) |
baseUrl |
Ollama API base URL (default: https://ollama.com) |
onport |
If set, starts an HTTP MCP server on this port instead of STDIO |
Usage:
mini-a mcp="(cmd: 'ojob mcps/mcp-ollama-web-search.yaml apiKey=YOUR_KEY')" goal='Search for latest AI news'
Tools: web-search
mcp-wiki
Persistent Markdown wiki knowledge base backed by the MiniAWikiManager. Exposes the wiki as an MCP server (STDIO or HTTP) so any MCP-compatible client can list, read, search, lint, and write wiki pages.
Configuration:
| Argument | Description |
|---|---|
wikibackend |
Backend type: fs (filesystem) or s3 (default: fs) |
wikiaccess |
Access mode: ro (read-only) or rw (read-write, default: ro) |
wikiroot |
Root directory for the fs backend (default: .) |
wikibucket |
S3 bucket name (s3 backend) |
wikiprefix |
S3 key prefix (s3 backend) |
wikiurl |
S3-compatible endpoint URL (s3 backend) |
wikiaccesskey |
S3 access key (s3 backend) |
wikisecret |
S3 secret key (s3 backend) |
wikimounts |
SLON/JSON array of read-only wiki mounts: [{name, backend, root|bucket|prefix|url|...}] |
usewikigraph |
Enable the wiki knowledge graph (auto-enabled when wikigraphfalkorhost is set); search transparently appends related-page hints |
wikigraphsearchhints |
Append graph-related pages to search results when the wiki graph is enabled (default: true) |
wikigraphhintcap |
Maximum graph-hint pages appended to search results (default: 5) |
wikigraphfalkorhost / wikigraphfalkorport / wikigraphfalkorgraph / wikigraphfalkoruser / wikigraphfalkorpass |
FalkorDB connection settings for graph-backed wiki state/query |
label |
Human-readable wiki label injected into tool descriptions |
toolPrefix |
Optional prefix for tool names (e.g. docs- → docs-list, docs-read, …) |
onport |
Start an HTTP MCP server on this port instead of STDIO |
Usage:
# STDIO: share a filesystem wiki with another agent
mini-a usetools=true \
mcp="(cmd: 'ojob mcps/mcp-wiki.yaml wikiroot=/shared/wiki wikiaccess=rw label=TeamWiki')" \
goal='Summarize what the wiki says about authentication'
# HTTP: standalone wiki server accessible by multiple clients
ojob mcps/mcp-wiki.yaml onport=8990 wikiroot=/shared/wiki wikiaccess=rw label=TeamWiki
Tools: list, read, search, lint, write (write requires wikiaccess=rw)
mcp-wiki-ops
Maintenance MCP for wiki lifecycle operations such as targeted edits, maintenance jobs, and full reindexing.
Configuration:
| Argument | Description |
|---|---|
wikibackend |
Backend type: fs, s3, s3fs, or es |
wikiaccess |
Access mode: ro or rw (reindex requires rw) |
wikiopsreadonly |
If true, disables mutating ops on this MCP server |
wikiroot |
Root directory for filesystem backend |
wikibucket |
S3 bucket name (s3/s3fs) |
wikiprefix |
S3 key prefix or Elasticsearch index name |
wikiurl |
Backend endpoint (s3/s3fs/es) |
wikimounts |
SLON/JSON array of read-only wiki mounts: [{name, backend, root|bucket|prefix|url|...}] |
usewikigraph |
Enable the wiki knowledge graph explicitly (auto-enabled when a FalkorDB host is provided) |
wikigraphcommunity |
Community detection algorithm for the wiki graph (default: louvain) |
wikigraphfalkorhost / wikigraphfalkorport / wikigraphfalkorgraph / wikigraphfalkoruser / wikigraphfalkorpass |
FalkorDB connection settings for graph-backed wiki state/query |
label |
Human-readable label used in tool descriptions |
toolPrefix |
Optional prefix for tool names |
onport |
Start in HTTP mode on this port instead of STDIO |
Usage:
# STDIO wiki maintenance server
mini-a usetools=true \
mcp="(cmd: 'ojob mcps/mcp-wiki-ops.yaml wikiroot=/shared/wiki wikiaccess=rw label=TeamWikiOps')" \
goal='Run wiki maintenance and trigger a reindex'
# HTTP standalone wiki maintenance server
ojob mcps/mcp-wiki-ops.yaml onport=8991 wikiroot=/shared/wiki wikiaccess=rw label=TeamWikiOps
Tools: lint, edit, maintain, reindex (reindex requires wikiaccess=rw and wikiopsreadonly=false), graph_build (build the wiki graph; structural always, semantic when semantic=true; syncs FalkorDB when configured), graph_falkor (query the wiki graph in FalkorDB, or resync when called without a query)
STDIO vs HTTP Usage
All built-in MCP servers use STDIO mode by default, meaning mini-a launches them as local child processes and communicates over standard input/output. This is the simplest setup and requires no network configuration.
For remote or shared deployments, MCP servers can also run in HTTP mode, where the server runs as a standalone service and mini-a connects to it over HTTP/SSE.
STDIO Mode (Default)
# Local MCP server launched as a child process
mini-a mcp="(cmd: 'ojob mcps/mcp-time.yaml')"
HTTP Mode
# Connect to a remote MCP server via URL
mini-a mcp="(type: remote, url: 'http://mcp-server.example.com:8080/mcp')"
| Mode | Pros | Cons |
|---|---|---|
| STDIO | No network setup, simple, self-contained | Single machine only |
| HTTP | Shared across users, centralized, scalable | Requires running a server |
Using Multiple MCPs
mini-a supports loading multiple MCP servers simultaneously by passing an array of MCP descriptors.
# Load multiple MCP servers
mini-a mcp="[(cmd: 'ojob mcps/mcp-time.yaml'), (cmd: 'ojob mcps/mcp-math.yaml'), (cmd: 'ojob mcps/mcp-web.yaml')]"
When using three or more MCP servers, enable proxy mode for better performance. The proxy aggregates all tool definitions into a single interface, reducing overhead.
If you need to republish several MCP servers as one standalone MCP endpoint for another client or service, use mcp-pass instead of mcpproxy=true. mcp-pass exposes the merged downstream tools directly, while proxy mode is primarily an internal aggregation mechanism for a running mini-a session.
# With proxy (recommended for 3+ MCPs)
mini-a mcpproxy=true mcp="[(cmd: 'ojob mcps/mcp-time.yaml'), (cmd: 'ojob mcps/mcp-math.yaml'), (cmd: 'ojob mcps/mcp-web.yaml')]"
# Republish multiple MCPs as one MCP endpoint for another client
ojob mcps/mcp-pass.yaml onport=9091 \
mainmcp="(cmd: 'ojob mcps/mcp-web.yaml')" \
othermcps="[(cmd: 'ojob mcps/mcp-time.yaml'), (cmd: 'ojob mcps/mcp-random.yaml')]"
You can also combine STDIO and HTTP servers in a single session:
# Mix local and remote MCP servers
mini-a mcp="[(cmd: 'ojob mcps/mcp-time.yaml'), (cmd: 'ojob mcps/mcp-math.yaml'), (type: remote, url: 'http://remote-mcp:8080/mcp')]"
Deploying MCP Servers in Docker & Kubernetes
Every built-in MCP server that accepts onport can run as a standalone HTTP service inside a container. The official openaf/mini-a image ships with the mini-a oPack (including all built-in MCPs) pre-installed, so a container only needs the OJOB environment variable pointing at the MCP definition inside the oPack: mini-a/mcps/<name>.yaml. Everything after the image name is passed as arguments to the oJob.
The
openaf/mini-aimage presetsOPACK_EXEC=mini-a, which would start the agent console after the oJob exits. Clear it with-e OPACK_EXEC=so the container runs only the MCP server.
Running a single MCP server in Docker
# Standalone mcp-time HTTP MCP server on port 8888
docker run -d --rm --name mcp-time \
-e OJOB=mini-a/mcps/mcp-time.yaml \
-e OPACK_EXEC= \
-p 8888:8888 \
openaf/mini-a \
onport=8888
Connect from any MCP client — including another mini-a:
mini-a mcp="(type: remote, url: 'http://localhost:8888/mcp')" goal='What time is it in Tokyo?'
Built-in MCP servers started with onport also expose /healthz and /metrics endpoints, ready for container health checks and Prometheus scraping. (mcp-pass serves only its MCP URI — use a TCP probe for it.)
mcp-pass as a passthrough gateway container
mcp-pass is the natural fit for containerized deployment: a single container connects to one main MCP plus any number of extra ones (local STDIO or remote HTTP) and republishes the merged tool set as one HTTP MCP endpoint.
docker run -d --rm --name mcp-gateway \
-e OJOB=mini-a/mcps/mcp-pass.yaml \
-e OPACK_EXEC= \
-p 9091:9091 \
openaf/mini-a \
onport=9091 uri=/mcp \
mainmcp="(type: remote, url: 'http://internal-mcp:8080/mcp')" \
othermcps="[(cmd: 'ojob mini-a/mcps/mcp-time.yaml'), (cmd: 'ojob mini-a/mcps/mcp-random.yaml')]" \
useprefix="core-,time-,rand-"
The STDIO MCPs referenced in othermcps are spawned inside the container as child processes — no extra containers or ports needed. Clients see a single endpoint at http://host:9091/mcp with the merged (and optionally prefixed/filtered) tools.
Quick TOON gateway: republish any MCP in TOON format
A common use of the gateway pattern is converting tool results from JSON to TOON to cut token usage for LLM clients. Set OAF_FLAGS="(MCPSERVER: (answerInTOON: true))" on the container — the STDIO MCP servers spawned inside it inherit the flag, serialize their tool results as TOON, and mcp-pass forwards that text verbatim:
docker run -d --rm --name mcp-gateway-toon \
-e OJOB=mini-a/mcps/mcp-pass.yaml \
-e OPACK_EXEC= \
-e OAF_FLAGS="(MCPSERVER: (answerInTOON: true))" \
-p 9091:9091 \
openaf/mini-a \
onport=9091 uri=/mcp \
mainmcp="(cmd: 'ojob mini-a/mcps/mcp-web.yaml')" \
othermcps="[(cmd: 'ojob mini-a/mcps/mcp-time.yaml'), (cmd: 'ojob mini-a/mcps/mcp-math.yaml')]"
Notes:
- The flag is honored by OpenAF’s MCP server helpers in both STDIO and HTTP modes, so it also works when running a single built-in MCP directly (without
mcp-pass). - Tool results produced by remote downstream MCPs pass through unchanged; enable the flag on those servers if you want end-to-end TOON.
- On the consuming side, mini-a can also use TOON internally — see
mcpproxytoonin the Configuration Reference.
Kubernetes deployment
The same gateway runs in Kubernetes with a standard Deployment + Service. oJob arguments go in args; environment configuration in env:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcp-gateway
spec:
replicas: 1
selector:
matchLabels:
app: mcp-gateway
template:
metadata:
labels:
app: mcp-gateway
spec:
containers:
- name: mcp-pass
image: openaf/mini-a
env:
- name: OJOB
value: mini-a/mcps/mcp-pass.yaml
- name: OPACK_EXEC
value: ""
- name: OAF_FLAGS
value: "(MCPSERVER: (answerInTOON: true))" # optional: TOON tool results
args:
- onport=9091
- uri=/mcp
- "mainmcp=(cmd: 'ojob mini-a/mcps/mcp-web.yaml')"
- "othermcps=[(cmd: 'ojob mini-a/mcps/mcp-time.yaml'), (cmd: 'ojob mini-a/mcps/mcp-math.yaml')]"
ports:
- containerPort: 9091
readinessProbe:
tcpSocket:
port: 9091
initialDelaySeconds: 10
livenessProbe:
tcpSocket:
port: 9091
periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: mcp-gateway
spec:
selector:
app: mcp-gateway
ports:
- port: 80
targetPort: 9091
Clients inside the cluster connect with:
mini-a mcp="(type: remote, url: 'http://mcp-gateway/mcp')" goal='...'
For single built-in MCPs deployed this way (e.g. mcp-wiki, mcp-es-search), prefer HTTP probes against /healthz instead of TCP probes. Use serverdesc on mcp-pass to give the gateway a distinct advertised identity, and includeTool/excludeTool to publish only a curated tool subset.
Image variants
| Image | Best for |
|---|---|
openaf/mini-a |
Running mini-a and its built-in MCPs (oPack pre-installed) |
openaf/oaf:edge + -e OPACKS=mini-a |
Custom oPack combinations; installs mini-a on first start |
Creating Custom MCPs
Custom MCP servers can be created following the Model Context Protocol specification. Any server that implements the MCP standard will work with mini-a, regardless of the programming language used to build it.
To create a custom MCP server for use with mini-a:
- Implement the MCP protocol (tool discovery and invocation over STDIO or HTTP)
- Define your tools with clear names, descriptions, and parameter schemas
- Load your custom server using the
mcpparameter with the path to your server script
# Load a custom MCP server
mini-a mcp="(cmd: 'path/to/my-custom-mcp.js')"
For examples and reference implementations, see the mini-a repository.
Ready to Try It?
Get mini-a running in under a minute and start using MCP servers.