| Name | Description | Type | oPack | Location |
|---|---|---|---|---|
| mcp-db | Database access MCP | STDIO/HTTP | (included) | mcp-db.yaml |
| mcp-email | Email sending MCP | STDIO/HTTP | (included) | mcp-email.yaml |
| mcp-es-search | ElasticSearch/OpenSearch full-text search MCP | STDIO/HTTP | ElasticSearch | mcp-es-search.yaml |
| mcp-file | Local file management MCP | STDIO/HTTP | (included) | mcp-file.yaml |
| mcp-notify | Notification MCP (Pushover) | STDIO/HTTP | opack install notifications |
Provided by the notifications oPack (see its documentation) |
| mcp-net | Network utility MCP | STDIO/HTTP | (included) | mcp-net.yaml |
| mcp-fin | Yahoo Finance market data MCP | STDIO/HTTP | (included) | mcp-fin.yaml |
| mcp-kube | Kubernetes management MCP | STDIO/HTTP | (included) | mcp-kube.yaml |
| mcp-time | Time and timezone utility MCP | STDIO/HTTP | (included) | mcp-time.yaml |
| mcp-random | Random data generation MCP | STDIO/HTTP | (included) | mcp-random.yaml |
| mcp-ch | Data channel MCP (STDIO/HTTP) | STDIO/HTTP | (included) | mcp-ch.yaml |
| mcp-ssh | SSH execution MCP (secure exec) | STDIO/HTTP | (included) | mcp-ssh.yaml |
| mcp-shell | Local shell execution MCP | STDIO/HTTP | (included) | mcp-shell.yaml |
| mcp-mini-a | Mini-A agent runner MCP | STDIO/HTTP | (included) | mcp-mini-a.yaml |
| mcp-a2a | A2A agent bridge MCP (consume external A2A agents as tools) | STDIO/HTTP | (included) | mcp-a2a.yaml |
| mcp-proxy | MCP proxy aggregating multiple downstream MCP connections | STDIO/HTTP | (included) | mcp-proxy.yaml |
| mcp-oaf | OpenAF / oJob / oAFp documentation MCP | STDIO/HTTP | (included) | mcp-oaf.yaml |
| mcp-oaf-browse | Generic browse MCP backed by the oJob-common HTTP Browse API | STDIO/HTTP | (included) | mcp-oaf-browse.yaml |
| mcp-oafp | OpenAF processor (oafp) runner & docs MCP | STDIO/HTTP | (included) | mcp-oafp.yaml |
| mcp-office | Office file utilities (XLSX/DOCX via plugin-XLS) | STDIO/HTTP | plugin-XLS | mcp-office.yaml |
| mcp-pass | MCP passthrough/merge server | STDIO/HTTP | (included) | mcp-pass.yaml |
| mcp-rss | RSS discovery and retrieval MCP | STDIO/HTTP | (included) | mcp-rss.yaml |
| mcp-s3 | S3 object storage MCP | STDIO/HTTP | (included) | mcp-s3.yaml |
| mcp-telco | Telecommunications utilities MCP (country codes, phone number info) | STDIO/HTTP | (included) | mcp-telco.yaml |
| mcp-weather | Weather information MCP (wttr.in) | STDIO/HTTP | (included) | mcp-weather.yaml |
| mcp-ollama-web-search | Ollama web search API MCP | STDIO/HTTP | (included) | mcp-ollama-web-search.yaml |
| mcp-web | Web search and URL fetching MCP | STDIO/HTTP | (included) | mcp-web.yaml |
| mcp-math | Mathematical operations and unit conversions | STDIO/HTTP | (included) | mcp-math.yaml |
See CREATING.md for instructions on creating new MCPs and contribution guidelines.
mcp-mini-a exposes the Mini-A agent as an MCP server. Use the run-goal tool to execute goals and retrieve the final answer plus runtime metrics. Launch-time arguments control sensitive capabilities (for example useshell, mcp, or model overrides); remote callers can only adjust the goal alongside formatting and planning flags. Provide shared knowledge or default rules at startup via knowledge= or rules= arguments when launching ojob.
The server identity and tool description are templatable at launch time using Handlebars {{varname}} substitution (powered by tplDesc):
| Parameter | What it controls | Default |
|---|---|---|
servername |
serverInfo.name advertised to MCP clients |
mini-a-agent |
servertitle |
Human-readable server title | OpenAF mini-a MCP agent runner server |
tooldesc |
Description of the run-goal tool shown to the model |
(built-in description) |
toolprefix |
Prefix prepended to every exposed tool name | (none) |
# Default launch — single run-goal tool, no customization
oafp in=mcp data="(cmd: 'ojob mcps/mcp-mini-a.yaml', tool: run-goal, params: (goal: 'summarize README.md', format: 'md', useplanning: true))"
# Persona: coding assistant with a renamed tool and scoped knowledge
ojob mcps/mcp-mini-a.yaml \
servername="coder-agent" \
servertitle="Mini-A Coding Assistant" \
tooldesc="Ask the coding agent to write, review, or fix code" \
knowledge="You are an expert software engineer. Prefer concise idiomatic code." \
mode=code \
onport=9000
# Add a prefix so the tool appears as devops-run-goal to the client
ojob mcps/mcp-mini-a.yaml toolprefix="devops-" rules="[no-shell]" onport=9001
# STDIO persona — used as mcp= inside another Mini-A instance
mini-a goal="..." \
mcp="(cmd: 'ojob mcps/mcp-mini-a.yaml servername=reviewer tooldesc=Review this code for quality issues')" \
usetools=truemcp-a2a bridges any external Google A2A-protocol agent into Mini-A as MCP tools. At startup it fetches each agent's /.well-known/agent.json Agent Card, registers its skills, and exposes two tools:
a2a-agents— lists all registered agents and their declared skills; passrefresh=trueto re-fetch cards live.a2a-task— sends a task to a named agent via JSON-RPC 2.0 (tasks/send) and polls (tasks/get) until the task reaches a terminal state, then returns the text artifacts.
Key launch parameters:
| Parameter | Description | Default |
|---|---|---|
agents |
Comma-separated base URLs of A2A agents to connect to | (required) |
apitoken |
Bearer token sent with every A2A HTTP request | (none) |
pollinterval |
Polling interval in ms while awaiting task completion | 1000 |
timeout |
Default task timeout in seconds | 120 |
# Start as an HTTP MCP server bridging two A2A agents
ojob mcps/mcp-a2a.yaml \
agents="http://agent1:9000,http://agent2:9000" \
onport=8888
# Use as mcp= inside Mini-A to give it access to external A2A agents
mini-a goal="use the data-analyst agent to summarize last quarter sales" \
mcp="(cmd: 'ojob mcps/mcp-a2a.yaml agents=http://analyst:9000')" \
usetools=true
# With authentication and a shorter poll interval
ojob mcps/mcp-a2a.yaml \
agents="https://secure-agent.example.com" \
apitoken="my-bearer-token" \
pollinterval=500 \
timeout=60 \
onport=8888mcp-proxy aggregates multiple downstream MCP connections (STDIO or HTTP remote) into a single unified MCP server. This enables you to expose a consolidated set of tools from various MCP sources through one endpoint, simplifying integration with LLMs and other MCP clients.
Key arguments:
mcp(required): JSSLON string describing one MCP connection or an array of MCP connection descriptors. Each descriptor follows the same format used with Mini-A'smcp=parameter.onport(optional): Start an HTTP MCP server on the specified port.libs(optional): Comma-separated libraries or@oPack/library.jsreferences to preload before connecting (useful for custom helpers or drivers).
The proxy exposes a single powerful tool:
proxy-dispatch: Interact with downstream MCP connections. Supports three actions:list: List all registered connections and their tools (optionally filter by connection).search: Search for tools across connections using a text query that matches against tool names, descriptions, and annotations.call: Invoke a specific tool on a target connection (automatically resolves which connection hosts the tool if unambiguous).
Available parameters for proxy-dispatch:
action(required): One oflist,search, orcall.connection(optional): Connection identifier or alias to scope the action.query(optional): Search text forsearchaction.tool(optional): Tool name forcallaction.arguments(optional): Input arguments to forward to the downstream tool when calling.meta(optional): Metadata object forwarded to the downstream MCP call.limit(optional): Maximum number of results forsearchactions.includeTools,includeInputSchema,includeAnnotations(optional): Control verbosity of returned metadata.refresh(optional): Refresh tool metadata from downstream MCPs before executing the action.
Example — aggregate multiple STDIO MCPs and call remotely:
# Start the proxy as an HTTP server aggregating mcp-time and mcp-net
ojob mcps/mcp-proxy.yaml onport=9090 \
mcp="[(cmd: 'ojob mcps/mcp-time.yaml'), (cmd: 'ojob mcps/mcp-net.yaml')]"
# List all available connections and their tools
oafp in=mcp data="(type: remote, url: 'http://localhost:9090/mcp', tool: proxy-dispatch, params: (action: list))"
# Search for tools related to 'time'
oafp in=mcp data="(type: remote, url: 'http://localhost:9090/mcp', tool: proxy-dispatch, params: (action: search, query: 'time'))"
# Call a specific tool through the proxy
oafp in=mcp data="(type: remote, url: 'http://localhost:9090/mcp', tool: proxy-dispatch, params: (action: call, tool: 'current-time'))"Example — mix STDIO and remote MCPs:
# Aggregate a local MCP and a remote one
ojob mcps/mcp-proxy.yaml onport=8080 \
mcp="[(cmd: 'ojob mcps/mcp-time.yaml'), (type: remote, url: 'http://external.mcp.local:1234/mcp')]"Example — use with Mini-A to access aggregated tools:
# The proxy can simplify mcp= configuration by consolidating multiple sources
mini-a goal="what time is it in Tokyo and what is my public IP?" \
mcp="(type: remote, url: 'http://localhost:9090/mcp')" rpm=20mcp-db provides JDBC-backed database access over STDIO or HTTP. Configure it with the following arguments:
jdbc(required): JDBC connection string.user/pass(optional): credentials to authenticate with the database.rw(optional): set totrueto allow write operations; defaults to read-only.libs(optional): comma-separated libraries or@oPack/library.jsreferences to preload before creating the connection (useful for helper functions or vendor drivers already available on disk).onport(optional): start an HTTP MCP server on the specified port.
ojob mini-a.yaml goal="create a 'test' table with all union european countries and cities" \
mcp="(cmd: 'ojob mcps/mcp-db.yaml jdbc=jdbc:h2:./data user=sa pass=sa libs=db/helpers.js', timeout: 5000)" \
knowledge="- generate H2 compatible SQL"ojob mini-a.yaml goal="build a markdown table with the contents of the 'test' table" \
mcp="(cmd: 'ojob mcps/mcp-db.yaml jdbc=jdbc:h2:./data user=sa pass=sa libs=db/helpers.js', timeout: 5000)" \
knowledge="- generate H2 compatible SQL" debug=trueojob mini-a.yaml goal="send an email reminding the team about today's standup" mcp="(cmd: 'ojob mcps/mcp-email.yaml smtpserver=smtp.example.com from=bot@example.com user=bot@example.com pass=<app_password> tls=true html=false', timeout: 5000)"mcp-file exposes file system operations (read, list, search, write, delete) restricted to a configurable root directory. By default all write/delete tools are disabled until you opt in with readwrite=true.
root(optional): absolute or relative base directory for all requests (defaults to the working directory). The MCP will reject paths that resolve outside of this root.readwrite(optional, default:false): enable write/delete capabilities. Without it, only read-only tools are available.
ojob mini-a.yaml goal="summarize the README in ./docs" \
mcp="(cmd: 'ojob mcps/mcp-file.yaml root=docs', timeout: 5000)"ojob mini-a.yaml goal="create a TODO.md placeholder inside ./notes" \
mcp="(cmd: 'ojob mcps/mcp-file.yaml root=notes readwrite=true', timeout: 5000)" \
knowledge="- ensure confirm=true is set when deleting files"ojob mini-a.yaml goal="send a notification saying 'Hello World from OpenAF MCP!'" \
mcp="(cmd: 'ojob notifications/mcp-notify.yaml pushoverkey=<your_pushover_key> userid=<your_user_id>', timeout: 5000)"ojob mini-a.yaml goal="get the public IP address of this machine" mcp="(cmd: 'ojob mcps/mcp-net.yaml', timeout: 5000)"ojob mini-a.yaml goal="tell me the current time in Tokyo and convert it to New York time" mcp="(cmd: 'ojob mcps/mcp-time.yaml', timeout: 5000)" knowledge="- prefer ISO 8601 timestamps"Key tools exposed by mcp-time include:
current-time: Provides detailed information about the current moment for an optional timezone.timezone-tools: Executes timezone utilities by passingoperationasconvert,difference, orlistalongside the relevant parameters.sleep: Pauses execution for a specified number of milliseconds using OpenAF'ssleepfunction.
mcp-random offers a collection of reproducible-friendly random data helpers covering integers, sequences, fractions, selections and Gaussian sampling. All tools accept an optional numeric seed to generate deterministic output when desired.
Key tools include:
random-integer: Returns a random integer within an inclusive range.random-sequence: Produces a shuffled range of integers, optionally truncated to a requested length.random-integer-set: Generates a sorted set of unique integers drawn from a range.gaussian-sample: Creates normally distributed samples usingjava.util.Random#nextGaussianwith configurable mean and standard deviation.random-fraction: Emits fractions between 0 and 1 rounded to configurable decimal places.random-choice: Picks one or more elements from a provided array, with optional uniqueness guarantees.random-boolean: Generates booleans with an optional bias probability fortrue.random-hex: Builds hexadecimal strings of a specific length.
This MCP exposes OpenAF data channels over STDIO or as an HTTP remote server. It accepts the following arguments:
onport(optional): start an HTTP MCP server on the specified port.chs(optional): a JSON/SLON array or map describing channels. Each channel object may include_name,_type,_rw(boolean read/write) and type-specific options (for examplefile: my-data.json). Example:( _name: my-data, _type: file, _rw: true, file: my-data.json )or as an array.libs(optional): comma-separated libraries or@oPack/library.jsreferences to preload before channel initialization; use it to bring additional helpers into scope.
Available tools (functions) exposed by mcp-ch:
ch-size: Returns the size of a data channel (input:dataCh).ch-keys: Returns keys of a data channel (input:dataCh, optionalextra).ch-values: Returns all values of a data channel (input:dataCh, optionalextra).ch-get: Get a value from a data channel (input:dataCh,key, optionalvalue).ch-set: Set a value in a data channel (input:dataCh,key,value). Requires channel to be writable.ch-unset: Unset a value in a data channel (input:dataCh,key). Requires channel to be writable.ch-set-all: Set multiple values usingkeyFieldsListandvaluesList(requires writable channel).ch-unset-all: Unset multiple values usingkeyFieldsListandvaluesList(requires writable channel).ch-list: List all configured data channels.
Example: start as HTTP remote server on port 12345 with two channels (one simple read-only and one file-backed writable):
ojob mcps/mcp-ch.yaml onport=12345 libs="@mini-a/utils.js" \
chs="[( _name: readonly, _type: simple, _rw: false ), ( _name: my-data, _type: file, _rw: true, file: my-data.json )]"Call ch-get via STDIO MCP (example using oafp to call a tool):
oafp in=mcp data="(cmd: 'ojob mcps/mcp-ch.yaml', tool: ch-get, params: (dataCh: 'my-data', key: (id: 1)))"Call ch-keys remotely against an HTTP MCP server:
oafp in=mcp data="(type: remote, url: 'http://localhost:12345/mcp', tool: ch-keys, params: (dataCh: 'my-data'))"This MCP provides a secure SSH-based executor. It exposes two main tools:
shell-exec: execute a single shell command over SSH and receive stdout, stderr and exit code.shell-batch: execute a batch of commands over SSH and receive an array of results for each command.
Important notes:
- The
sshargument is mandatory and must be an OpenAF SSH URL (for example:ssh://user:pass@host:22/identKey?timeout=12345). - By default the MCP is read-only; set
readwrite=trueto allow commands that are normally blocked by the security policy. - Fine-tune command filtering with
shellallow(allow specific commands),shellbanextra(add more banned commands), andshellallowpipes(permit pipes/redirection).
Example — run a single command via STDIO MCP:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-ssh.yaml ssh=ssh://user:pass@host:22/ident readwrite=false', tool: shell-exec, params: (command: 'uptime'))"Example — start mcp-ssh as a remote HTTP MCP server on port 8888:
ojob mcps/mcp-ssh.yaml onport=8888 ssh=ssh://user:pass@host:22/ident readwrite=falseExample — call shell-batch remotely:
oafp in=mcp data="(type: remote, url: 'http://localhost:8888/mcp', tool: shell-batch, params: (commands: ['echo hello','date']))"mcp-es-search exposes a focused read-only interface over an ElasticSearch or OpenSearch index. It is designed for documentation or knowledge-base retrieval, with optional toolPrefix support so multiple indexes can coexist in the same agent session without name collisions.
Key arguments:
urlandindex(required): endpoint and default index to query.toolPrefix(optional): prepends tool names, for exampledocs-createsdocs-search,docs-get,docs-read,docs-info.label(optional): human-readable description injected into tool metadata.user/password(optional): HTTP Basic authentication.pathField,contentField,titleField(optional): map the document schema when your index does not use the defaults.
Tools:
search: full-text search with optional metadata filters and native highlights.get: fetch a document by_idor by exactpathFieldvalue.read: read a controlled slice of document content (head,tail, explicit line ranges, or regex matches).info: inspect index statistics and field mappings.
Example — search an indexed documentation corpus:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-es-search.yaml url=http://localhost:9200 index=docs toolPrefix=docs- label=\"Project docs\"', tool: docs-search, params: (query: 'authentication token', size: 5))"Example — read just the first lines of a matched document:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-es-search.yaml url=http://localhost:9200 index=docs', tool: read, params: (id: 'README.md', mode: 'head', lines: 40))"This MCP serves OpenAF, oJob and oAFp documentation and cli utilities over STDIO or as an HTTP remote server. It exposes tools such as:
openaf-doc: search and return OpenAF help entries or the full help (cli mode returns oaf -h output)ojob-doc: return oJob help or reference documentationopenaf-version: return OpenAF version and distributionoafp-doc: return aOFp help/readme topics
Example — run locally and list OpenAF help (stdio mode):
ojob mcps/mcp-oaf.yamlExample — request OpenAF help remotely (HTTP mode on port 8888):
oafp in=mcp data="(type: remote, url: 'http://localhost:8888/mcp', tool: openaf-doc, params: (search: 'help'))"mcp-oaf-browse turns an existing oJob-common HTTP Browse API into MCP tools. This is useful when you already have a browse-style HTTP endpoint and want Mini-A to explore it through stable list/get/search operations instead of custom prompt logic.
Key arguments:
browseAPIURLandbrowseUri(required): base Browse API endpoint and the target browse root.label(optional): descriptive label shown in tool descriptions.toolPrefix(optional): prefixes tool names to avoid collisions.headers(optional): HTTP headers sent on every Browse API request.defaultParams(optional): query parameters merged into every Browse API request.
Tools:
list: enumerate entries beneath the configured browse root.get: retrieve a single object by relative path.search: recursively search browse results using a regex with configurable depth and result limits.
Example — expose a local Browse API subtree as MCP tools:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-oaf-browse.yaml browseAPIURL=http://127.0.0.1:8091/api/browse browseUri=/files label=\"Workspace files\" toolPrefix=files-', tool: files-list, params: (path: 'docs'))"mcp-kube exposes selected Kubernetes management operations powered by the Kube oPack. It works either as a STDIO MCP or as an HTTP remote MCP. Configure connection credentials to your cluster through the startup arguments (url, user, pass, token, namespace, etc.). Set readwrite=true to enable operations that modify cluster resources. Use kubelib when you need to point at a specific kube.js location.
Available tools include:
list-namespaces: List all namespaces in the cluster.get-resource: Retrieve Kubernetes objects or metrics via a single tool. Supportedresourcevalues includepods,deployments,statefulsets,clusterroles,clusterrolebindings,roles,rolebindings,ingresses,networkpolicies,resourcequotas,storageclasses,services,service-accounts,secrets,replicasets,persistent-volume-claims,persistent-volumes,nodes,configmaps,jobs,daemonsets,cronjobs,endpoints,pod,events,pods-metrics,nodes-metrics, andnode-metrics(with optionalnamespace,full, andname/nodeparameters as applicable).get-log: Retrieve logs from a pod (optionally container/stream specific).apply-manifest: Apply a manifest (requiresreadwrite=true).delete-manifest: Delete resources described by a manifest (requiresreadwrite=true).scale-resource: Scale a workload resource (requiresreadwrite=true).
Example — list pods in the default namespace using STDIO MCP:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-kube.yaml url=https://k8s.example.com:6443 token=<bearer_token> namespace=default', \
tool: get-resource, params: (resource: pods, namespace: default, full: false))"Example — run as an HTTP MCP server on port 9000 and fetch node metrics remotely:
ojob mcps/mcp-kube.yaml onport=9000 url=~/.kube/config readwrite=false
oafp in=mcp data="(type: remote, url: 'http://localhost:9000/mcp', tool: get-resource, params: (resource: nodes-metrics))"Small excerpt from mcp-oaf.yaml showing purpose and tools (truncated):
# Author: Nuno Aguiar
help:
text: A STDIO/HTTP MCP OpenAF tools documentation server
expects:
- name: onport
desc: If defined starts a MCP server on the provided port
jobs:
- name: OpenAF documentation
exec: | #js
if (args.cli) {
return "```" + $sh(getOpenAFPath() + "oaf -h").get(0).stderr + "```"
} else {
if (isUnDef(args.search)) {
return global.oaf_docs
} else {
return searchHelp(args.search)
}
}mcp-oafp wraps the OpenAF processor (oafp) so that you can both execute transformations and inspect the embedded documentation. Key tools include:
run-oafp: invoke theoafpfunction directly with arbitrary parameters and optional inline data.list-commands: parse the usage table into structured option metadata (supports filtering).get-doc: retrieve the usage, filters, template helper or examples markdown.search-doc: perform keyword searches across all documentation sections.discover-capabilities: expose the dynamic inputs/transforms/outputs list (respecting optionallibs).
Example — call oafp to convert CSV into JSON:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-oafp.yaml', tool: run-oafp, params: (params: (in: csv, out: json), data: 'name\\nage\\nJohn,42'))"Example — search for filters documentation mentioning SQL:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-oafp.yaml', tool: search-doc, params: (query: 'sql'))"mcp-office wraps plugin-XLS helpers so Mini-A can read or write XLSX and DOCX files within a restricted root directory. It defaults to read-only mode; start it with readwrite=true to enable the write tools.
Arguments:
root(optional, default current directory): base directory that all office file operations must stay inside.readwrite(optional, defaultfalse): enables write operations.onport(optional): expose the MCP over HTTP instead of STDIO.
Tools:
xlsx-read-table: read a worksheet region into a JSON table.xlsx-write-table: write an array of objects into an XLSX/XLS sheet.docx-read-paragraphs: extract ordered paragraphs from a DOCX file.docx-write-paragraphs: create or append DOCX paragraphs and an optional table.
Example — read the first worksheet rows from a workbook:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-office.yaml root=./data', tool: xlsx-read-table, params: (path: 'report.xlsx', sheet: 'Finance', startColumn: 'A', startRow: 1, maxRows: 10))"Example — write a DOCX summary (requires readwrite=true):
oafp in=mcp data="(cmd: 'ojob mcps/mcp-office.yaml root=./docs readwrite=true', tool: docx-write-paragraphs, params: (path: 'summary.docx', paragraphs: ['Weekly summary', (text: 'Status green', style: 'Heading2')], createMissingDirs: true))"mcp-pass is a passthrough MCP combiner. You point it at one mainmcp plus zero or more othermcps, and it republishes the union of their tools through a single MCP surface. Unlike mcp-proxy, it does not expose a dispatcher tool; it forwards the downstream tools directly.
Arguments:
mainmcp(required): primary MCP connection descriptor.othermcps(optional): array of extra MCP connection descriptors whose tools should be merged in.usesse(optional): when serving over HTTP, return responses as Server-Sent Events.uri(optional): custom HTTP route prefix when serving remotely.
Example — republish one remote MCP plus extra helpers under a single endpoint:
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')]"mcp-shell provides a controlled execution environment for local shell commands. It mirrors Mini-A's built-in allow/deny lists and lets you opt into additional binaries or shell features.
Startup flags:
readwrite(defaultfalse): Allow commands that may change system state.shellallow: Comma-separated allow-list of commands to unblock.shellbanextra: Additional commands to forbid even if normally allowed.shellallowpipes: Permit pipes, redirects, and control operators.cwd,timeout,env: Set defaults for commands invoked through the MCP.
Exposed tools:
shell-exec: Run a single command with optional stdin, cwd, timeout, env, andparseJsontoggles.shell-batch: Execute an array of commands (strings or maps) sequentially, inheriting top-level cwd/timeout/env values.
Example — run disk usage diagnostics with an explicit allow-list:
mini-a goal="summarize disk usage" \
mcp="(cmd: 'ojob mcps/mcp-shell.yaml shellallow=df,du timeout=4000', timeout: 5000)" rpm=20mcp-s3 wraps the OpenAF S3 library so the agent can browse buckets, read objects, upload new payloads, or generate pre-signed URLs. The server is read-only unless you explicitly opt into write/delete support.
Key arguments:
url,accessKey,secret,region: Connection details for your S3-compatible endpoint (all optional for public buckets).bucket: Default bucket when the tool input omits one.readwrite: Enable write/delete operations (falseby default).useversion1,ignorecertcheck: Compatibility flags for legacy or self-hosted endpoints.
Primary tools:
s3-list-buckets,s3-list-objects: Enumerate accessible buckets or bucket contents.s3-get-object: Retrieve object data with optional range reads or metadata fetches.s3-put-object,s3-delete-object: Manage objects whenreadwrite=true.s3-presign-get: Produce temporary GET URLs for sharing or ingestion pipelines.
Example — list JSON reports under a prefix:
mini-a goal="audit nightly reports" \
mcp="(cmd: 'ojob mcps/mcp-s3.yaml bucket=ops-data prefix=reports/nightly/', timeout: 5000)" rpm=20Example — upload a processed artifact (write mode):
mini-a goal="publish sanitized metrics" \
mcp="(cmd: 'ojob mcps/mcp-s3.yaml bucket=ops-data readwrite=true', timeout: 5000)" \
knowledge="- encode uploads as base64 when calling s3-put-object" rpm=20mcp-telco provides telecommunications utilities including country information lookup by calling code and detailed phone number parsing using Google's libphonenumber library.
Arguments:
onport(optional): start an HTTP MCP server on the specified port.
Tools:
country-by-code: Retrieve country information for a given calling code.- Input:
code(string, required) - The country calling code without the leading '+' (e.g., "1" for US/Canada).
- Input:
phone-number-info: Parse and analyze phone numbers to extract region, carrier, validity, and formatting details.- Input:
number(string, required) - Phone number in E.164 or national format (e.g., "+14155552671"). - Input:
country(string, optional, default "US") - The country/region code from which the number is dialed.
- Input:
Example — look up country information by calling code:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-telco.yaml', tool: country-by-code, params: (code: '44'))"Example — analyze a phone number:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-telco.yaml', tool: phone-number-info, params: (number: '+14155552671', country: 'US'))"Example — use with Mini-A to validate phone numbers:
mini-a goal="validate and format the phone number +442071234567" \
mcp="(cmd: 'ojob mcps/mcp-telco.yaml', timeout: 5000)" rpm=20mcp-fin pulls market intelligence from Yahoo Finance. It lazily initialises the bundled apiYFinance.js helper and exposes two deterministic tools:
get-ticker-data: Fetch historical price series, ranges, and technical indicators for a givensymbol(setraw=trueto inspect the untouched Yahoo response).get-ticker-fundamentals: Retrieve company fundamentals (income statement, balance sheet, etc.) with the same optionalrawflag.
Example — compare revenue growth across two tickers:
mini-a goal="chart revenue for NVDA vs AMD" \
mcp="(cmd: 'ojob mcps/mcp-fin.yaml', timeout: 5000)" rpm=20mcp-ollama-web-search forwards web queries to Ollama's web_search API. It is useful when you want a managed search provider exposed as a simple MCP tool instead of scraping search engines directly.
Arguments:
apiKey(required unlessOLLAMA_API_KEYis set): Ollama API key.baseUrl(optional, defaulthttps://ollama.com): alternate Ollama API base URL.onport(optional): expose the MCP over HTTP.
Tool:
web-search: submit aqueryand optional extra payloadoptionsto Ollama's API.
Example — run a search through Ollama:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-ollama-web-search.yaml apiKey=<ollama_api_key>', tool: web-search, params: (query: 'OpenAF MCP server examples'))"mcp-rss simplifies monitoring blogs and news feeds. It ships with a curated catalogue (AWS, OpenAI, TechCrunch, etc.) and allows both direct fetches and discovery lookups.
Tools:
get-rss-feed: Download and normalise feed items. Acceptsnodesc=trueto strip descriptions,pathto override the item array location, anduserAgentto customise the HTTP header.find-rss-url: Search the bundled catalogue for feeds whose names include aquerysubstring.
Example — locate an official feed and pull the latest posts:
mini-a goal="summarize the most recent Azure announcements" \
mcp="(cmd: 'ojob mcps/mcp-rss.yaml', timeout: 5000)" rpm=20mcp-web provides web search, URL retrieval, and generic HTTP request capabilities. It performs searches via DuckDuckGo, fetches web pages using jsoup, and can execute direct HTTP requests with $rest.
Arguments:
onport(optional): start an HTTP MCP server on the specified port.readwrite(optional, default:false): allows mutatinghttp-requestmethods (POST,PUT,PATCH,DELETE). Without it, onlyGETandHEADare allowed.
Tools:
web-search: Search the web and return an array of results withtitle,description, andlink.- Input:
query(string, required),limit(number, default 12),searchEngine(string, defaultduckduckgo/ddg).
- Input:
get-url: Fetch and process a single URL.- Input:
url(string, required),style(enumhtml|basic|text|map, defaultbasic).
- Input:
http-request: Execute a direct HTTP request and return the raw$restresponse map.- Input:
url(string, required),method(enumGET|HEAD|POST|PUT|PATCH|DELETE, defaultGET),data(object, optional forPOST/PUT/PATCH),headers(object, optional),throwExceptions(boolean, defaultfalse). POST/PUT/PATCH/DELETErequire starting the MCP withreadwrite=true.
- Input:
Example — search the web (STDIO MCP):
mini-a goal="find the official Rust language blog and summarize the latest post" \
mcp="(cmd: 'ojob mcps/mcp-web.yaml', timeout: 5000)" rpm=20 __format=mdExample — fetch a URL as text:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-web.yaml', tool: get-url, params: (url: 'https://www.rust-lang.org/', style: 'text'))"Example — HTTP HEAD request:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-web.yaml', tool: http-request, params: (url: 'https://www.rust-lang.org/', method: 'HEAD'))"Example — HTTP PATCH request (requires readwrite=true):
oafp in=mcp data="(cmd: 'ojob mcps/mcp-web.yaml readwrite=true', tool: http-request, params: (url: 'https://example.com/api/item/1', method: 'PATCH', data: (status: 'done')))"Example — run as HTTP MCP server and call remotely:
ojob mcps/mcp-web.yaml onport=9999
oafp in=mcp data="(type: remote, url: 'http://localhost:9999/mcp', tool: web-search, params: (query: 'site:openaf.io jsoup', limit: 5))"mcp-weather fronts wttr.in to provide structured weather data (or ANSI forecasts when desired).
Available tool:
get-weather: request weather data for a location with optionalansi,oneline,format, oroptionstweaks.
Example — retrieve the JSON forecast for Lisbon:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-weather.yaml', tool: get-weather, params: (location: 'Lisbon, Portugal'))"mcp-math provides mathematical operations, statistical analysis, unit conversions, and number properties. All tools are deterministic and read-only.
Available tools:
calculate: Perform basic and advanced mathematical operations (add, subtract, multiply, divide, power, sqrt, abs, sin, cos, tan, log, ln, exp, ceil, floor, round).- Input:
operation(string),values(array of numbers), optionalprecision(decimal places).
- Input:
statistics: Calculate statistical measures for a dataset (mean, median, mode, stddev, variance, min, max, sum, count, range).- Input:
values(array of numbers), optionalmetrics(array of metric names to return).
- Input:
convert-unit: Convert values between units of measurement (length, mass, temperature, volume).- Input:
value(number),fromUnit(string),toUnit(string), optionalprecision. - Supported units: m, km, mi, ft, in, cm, mm, yd (length); kg, g, lb, oz (mass); c, f, k (temperature); l, ml, gal, qt, pt, cup (volume).
- Input:
number-info: Analyze number properties including prime check, factors, prime factorization, and more.- Input:
value(number).
- Input:
Example — perform calculations:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-math.yaml', tool: calculate, params: (operation: 'add', values: [10, 20, 30]))"Example — calculate statistics:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-math.yaml', tool: statistics, params: (values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))"Example — convert units:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-math.yaml', tool: convert-unit, params: (value: 100, fromUnit: 'km', toUnit: 'mi', precision: 2))"Example — analyze number properties:
oafp in=mcp data="(cmd: 'ojob mcps/mcp-math.yaml', tool: number-info, params: (value: 42))"Example — use with Mini-A for complex math tasks:
mini-a goal="Calculate the mean and standard deviation of temperatures [20, 22, 19, 23, 21] and convert the mean from Celsius to Fahrenheit" \
mcp="(cmd: 'ojob mcps/mcp-math.yaml', timeout: 5000)" rpm=20 __format=mdAll MCPs in this catalog can be used in two modes:
- STDIO mode: The MCP is executed directly and communicates via standard input/output.
- HTTP remote server mode: By providing the
onportargument, the MCP will start an HTTP server on the specified port, allowing remote calls.
ojob mcps/mcp-db.yaml onport=12345This will start the MCP on port 12345. You can then interact with it remotely using HTTP requests or by configuring tools to use the remote MCP endpoint.
You can use the same approach for any MCP in the catalog (e.g., mcp-email.yaml, mcp-notify.yaml, mcp-net.yaml).
List tools:
oafp in=mcp data="(cmd: 'docker run --rm -i mcp/wikipedia-mcp')" inmcptoolslist=trueCall a tool:
oafp in=mcp data="(cmd: 'docker run --rm -i mcp/wikipedia-mcp', tool: extract_key_facts, params: (title: 'Portugal'))"List tools:
oafp in=mcp data="(type: remote, url: 'http://wikipedia.mcps.local:1234/mcp')" inmcptoolslist=trueCall a tool:
oafp in=mcp data="(type: remote, url: 'http://wikipedia.mcps.local:1234/mcp', tool: extract_key_facts, params: (title: 'Portugal'))"Remember to adjust hostnames, ports, and authentication parameters to match the MCP instance you are testing against.
To execute the full Mini‑A test suite, run the following from the main repository folder:
ojob tests/autoTestAll.yaml
This uses oJob to orchestrate all tests; running from the repo root ensures relative paths resolve correctly.
The test run will produce an autoTestAll.results.json file in the repository. Review it for outcomes and remove it before your final commit.