MetaForge for Codex
Generated by scripts/build_integrations.py — do not edit by hand.
As a plugin
Codex reads a marketplace at .agents/plugins/marketplace.json, and an
entry's ./plugins/<name> resolves from the directory that contains
.agents/, not from the marketplace file:
<root>/.agents/plugins/marketplace.json <- copy marketplace.json here
<root>/plugins/metaforge/ <- copy this directory here
<root> is either your project or your home directory. Restart Codex,
then /plugins.
Or wire the MCP server up by hand
Append config.toml to ~/.codex/config.toml and restart. This needs no
plugin and is the path this repo has been running.
What is verified
Loaded and driven end to end against codex-cli 0.118.0 and 0.159.2 — the manifest format survived that upgrade unchanged, which is the thing most worth knowing, since the format was read out of the binary rather than from a published spec.
Installation, checked by driving codex app-server over stdio
rather than by eyeballing /plugins:
plugin/listfinds the marketplace and returnsmetaforge@metaforgewithmarketplaceLoadErrors: []— the manifest parses,installPolicyandauthPolicysurvive, and everyinterfacefield lands where the curated plugins put theirs.plugin/readresolves all 43 skills andmcpServers: ["metaforge"].plugin/installsucceeds and writes[plugins."metaforge@metaforge"]into~/.codex/config.toml.- Codex connects to the MCP server itself: its client logs
server_info: Implementation { name: "metaforge-mcp" }at protocol2025-06-18, andtools/listreturns the MetaForge tools.
And the agent actually uses them:
- A read goes through. Codex called
project.listand got back astatus: successenvelope. - A write is held. Codex called
project.create; the server refused with-32001/code: approval_required,outcome: not_configured,retryable: false, naming the caller as untrusted. A follow-upproject.listcame back empty, so the write did not run — which is the point. A guardrail that returns an error after doing the write is worse than none, because the error makes it look like it held.
That second one is why the guardrails exist at all: the same tool was gated when a person asked in the dashboard and ungated when an external harness asked over MCP. It is gated now, and this is an external harness asking.
One cosmetic wart: Codex opens GET /mcp for a server-initiated SSE
stream, the sidecar answers 405 (which the Streamable HTTP spec
permits), and Codex logs that as an ERROR line before carrying on
normally. It is not a failure — ignore it.
If the plugin ever stops loading, re-check the manifest format against your Codex version first: it is read from the binary, not from a published spec, so a Codex upgrade can move it.
Skills
43 engineering skills are bundled. Codex prefixes a plugin's
skills with its name, so they appear as metaforge:<skill>.