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


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-pass when you want the merged tools to appear directly to the client.
  • Use mcp-proxy when 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


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-a image presets OPACK_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 mcpproxytoon in 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:

  1. Implement the MCP protocol (tool discovery and invocation over STDIO or HTTP)
  2. Define your tools with clear names, descriptions, and parameter schemas
  3. Load your custom server using the mcp parameter 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.