With fnox 1.45.0, an AI agent can ask you for a missing secret through a one-time local page, so the value never goes through the chat. fnox proxy run can now start before every secret is set, and it serves fnox's MCP tools using placeholders instead of real values. fnox env --describe also reports which file defines each key, and symlinked global configs now work with [files].
Added
request_secretMCP tool (#1065, #1074, #1075) by @jdx. When an agent needs a credential you haven't stored yet, it can ask fnox for it by name. fnox serves a one-time page on127.0.0.1and sends the link to the MCP client through URL-mode elicitation. You type the value on that page and fnox stores it the same wayfnox setdoes. The agent is told only that the secret was stored, andexecinjects it from then on. The tool is off by default:default_provider = "age" [mcp] tools = ["exec", "request_secret"]
- If
mcp.secretsis set, the agent can only ask for names on that list. Theplainprovider is refused. If the secret already has a value, fnox doesn't ask for it again unless the agent passesreplace: true. - The link works once and expires after 10 minutes. The page rejects cross-site form posts. After you save, a reload shows the result for 60 seconds and doesn't store the value a second time.
- If the client doesn't support URL-mode elicitation, no page opens. Instead, the agent is told to ask you to run
fnox set NAMEin your own terminal. If the client rejects or cancels the prompt, or the request times out, the agent gets a message that is different from the one sent when you click Decline. That message also tells the agent not to reopen the prompt or ask for the secret in chat. - The input is a single line, so multi-line values such as PEM keys still need
fnox set --from-file. The page can't prove that you are the one filling it in. Another program running as your user could submit a value.
- If
- MCP tools under
fnox proxy run(#1072) by @jdx. When an agent runsfnox mcpinsidefnox proxy run(including--sandbox), the MCP server now relays to the proxy, and you don't need to change the agent's MCP config.get_secretreturns the secret's placeholder instead of its real value.request_secretopens its page from the proxy process, outside the sandbox. After you enter the value, the proxy starts injecting it into matching requests.execisn't offered in this mode.[mcp] toolsandsecretsstill apply. Only secrets that have a proxy rule can be used this way. Once the child starts,fnox proxy runno longer prompts for provider authentication, so authenticate before you start it. - Pending proxy secrets (#1071) by @jdx. Before,
fnox proxy runexited if any rule's secret had no value. Now, if a secret is declared but not set, fnox prints a warning, starts anyway, and still gives the command a placeholder. Requests that need the secret get a 403 with a "not set yet" message. When you set the secret, for example withfnox set STRIPE_KEYin another terminal, the next matching request picks it up without a restart. The proxy checks for the value at most once every 3 seconds per secret. A rule that names an undeclared secret is still an error.[secrets] STRIPE_KEY = { description = "Stripe test key" } [[proxy.rules]] secret = "STRIPE_KEY" domain = "api.stripe.com"
- Key source in
fnox env --json --describe(#1059) by @jdx. Each key now has asourcefield withpath, the file whose definition wins, andglobal, which is true for the global config and the files it imports. Tools such as mise can use this to tell a project's own keys from your personal global ones. The field is left out when fnox can't trace a key to a file. The describe schema version is still 1. Infnox-client,KeyInfogainssourceand awith_sourcebuilder."source": { "path": "/home/me/.config/fnox/config.toml", "global": true }
Fixed
- Symlinked global config and source files (#1063) by @jdx. fnox 1.44.0 refused
[files]when~/.config/fnox/config.tomlwas a symlink, as dotfiles managers such as stow create. Becausefnox set --filehad already stored the entry, every later command failed. fnox also rejected source files linked into~/.config/fnox/files/. Both now work.fnox setandfnox reencryptwrite through a source link instead of replacing it. They report an error, before storing anything, if the link is broken or points to the config file or to another entry's file. One case is now stricter: a projectfnox.tomlthat is a symlink into the config directory can no longer declare[files].
Full Changelog: v1.44.0...v1.45.0
💚 Sponsor fnox
fnox is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If fnox handles secrets or config for you or your team, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep fnox secure, free, and independent.