OpenPrefs is central config for your agents, workflows and jobs. Flip a toggle or edit a value on the dashboard, and each one reads it at the start of its next run, over MCP or REST. Every change is logged with who made it, and one tap puts it back.
https://mcp.openprefs.aiFree to sign up. Streamable HTTP, with OAuth 2.1 or a bearer token.
Say you have an agent that pings your website. One day you want it off. Turn off its toggle on the dashboard, and the next time it runs, it reads the setting and stops. No redeploy, no code change.
Create its settings on the dashboard, such as an on/off toggle and a check interval, or let the agent create its own with define_preference in a space it can write to. Each one is typed: a toggle is on or off, an interval is a number.
First thing every run, the agent calls get_preferences for its keys. If the toggle is off, it stops. If not, it uses the values it just read.
Edit a value in OpenPrefs whenever you like. Nothing is pushed to the agent: it picks up the new value the next time it runs and reads.
Over MCP, the agent calls get_preferences with the keys it needs, up to 20 at once. Over REST, the same tool is a POST to https://api.openprefs.ai/agent/v1/get_preferences.
Each value comes back typed: true or false for a toggle, a number for a number. Decide what your job does if it can’t reach its config, such as skipping the run.
If a setting is set to ask before reading, its value is held back until you approve, and the response says so in a pending field.
get_preferences({
"keys": [
"uptime.enabled",
"uptime.check_interval_minutes",
"uptime.alert_channel",
"uptime.alert_hours"
]
})import os, requests
r = requests.post(
"https://api.openprefs.ai/agent/v1/get_preferences",
headers={"Authorization": f"Bearer {os.environ['OPENPREFS_TOKEN']}"},
json={"keys": ["uptime.enabled", "uptime.check_interval_minutes"]},
timeout=10,
)
r.raise_for_status()
prefs = {p["key"]: p.get("value") for p in r.json()["preferences"]}
if not prefs.get("uptime.enabled"):
print("Uptime ping is off in OpenPrefs. Skipping this run.")
raise SystemExit(0)
interval = prefs["uptime.check_interval_minutes"]Every value is checked against its type, so a job never has to parse a note to find out what to do.
uptime.enabledTurn it off, and the next run reads false and skips.
uptime.check_interval_minutesuptime.alert_channeluptime.alert_hoursA time rule carries whether it’s on, its days and its window. Your job checks the window when it runs.
reports.nightly_recipientscontent.max_posts_per_dayConfigure your agents, workflows and jobs from one dashboard. Each one gets only the access you give it, and every read and change shows up in the log.
Apps that sign in to a connector use OAuth. Scripts, cron jobs and apps configured with a file use a token you create in OpenPrefs.
One command, with a token made for Claude Code.
YOUR_TOKEN. The token dialog also shows it with your token filled in./mcp to check that OpenPrefs is connected.Add an MCP Client Tool node to your AI Agent node and set:
https://mcp.openprefs.aiTo get a token: in OpenPrefs, open Agents, select Connect an agent, then Create new token. Name it after the workflow and pick what it can use. It’s shown only once.
Apps that sign in to a connector (a custom connector or remote MCP server): add https://mcp.openprefs.ai. The app sends you to OpenPrefs to approve it. No token needed.
Apps with a config file, like Cursor, use a token. In OpenPrefs, open Agents, select Connect an agent, then Create new token. The dialog shows this config with your token filled in.
Some apps name the address serverUrl instead of url. Check your app’s MCP instructions, or see the guide for other MCP apps.
The same 10 tools, for cron jobs, scripts and agents that don’t speak MCP. Each tool is a POST to https://api.openprefs.ai/agent/v1/<tool> with a JSON body.
Authenticate with a token you created in OpenPrefs, or an OAuth access token issued for the REST API.
Hand your agent the OpenAPI spec. It describes every tool, field and response.
The same tools over MCP and REST. Every call reaches only the spaces you gave that agent.
Check the config before the run starts.
search_preferencesFind a setting by words, even with typos. Handy when the agent doesn’t know the exact key.get_preferencesRead up to 20 settings by exact key. The call to make at the start of each run.list_itemsRead a list in order, one page at a time, like a report’s recipients.list_containsCheck which labels a list holds, like whether an address is already a recipient.Let an agent set up or adjust its own config, with a reason you can see.
set_preferencesSet up to 20 values at once. Each is checked against its type.define_preferenceCreate a new setting from code, with no restart, in a space the agent can write to.add_list_itemsAdd to a list. Items already there are reported, not added twice.update_list_itemsRename an item or change its details.remove_list_itemsRemove items from a list by label.delete_preferenceDelete a setting you no longer need.Every change carries a one-sentence reason, so the log shows why a value changed.
Connect one agent, give it one setting, and turn it off from the dashboard to see the whole loop.
In OpenPrefs, select New preference. Make a toggle named Enabled in a new space called Uptime, and turn it on. Its key is uptime.enabled.
Pick your client in Connect above, and give the agent access to the Uptime space only. Read only is enough to read the switch.
Have your agent read uptime.enabled at the start of its run: it gets true. Turn it off in OpenPrefs, and the next run reads false and skips. The read and your change both show in Activity, with undo.
https://mcp.openprefs.ai, at the root, with no /mcp path. It uses Streamable HTTP.POST to https://api.openprefs.ai/agent/v1/<tool>.Change the setting, not the code.