Declare identity and the smallest security boundary
shimpz.toml contains public identity, Brain guidance, and access intent. It never
contains Action schemas, runtime commands, OAuth endpoints, client credentials, or tokens.
Two required tables and optional link and Integration tables
[shimpz]
spec = 1
id = "shimpz-cloudflare"
version = "0.5.2"
name = "Cloudflare"
summary = "Set up your domains' DNS without opening a dashboard or memorizing records."
description = "Look up your Cloudflare domains and their DNS records, and create, replace, or delete A, AAAA, CNAME, and TXT records without opening the Cloudflare dashboard. Every change waits for your password before anything reaches Cloudflare."
creators = ["@shimpz"]
github = "https://github.com/TheShimpz/shimpz-cloudflare"
genesis = """
Use this Assistant to inspect Cloudflare zones and to manage reviewed A, AAAA, CNAME, and TXT DNS records.
Call list-zones to discover available zones and get-zone for exact zone details. Call DNS-record Actions only with
a zone_id returned by list-zones, and get-dns-record only with a record_id returned by list-dns-records. Start with
page 1 and a small per_page. Use ensure-dns-record to converge on one exact state, replace-dns-record for a complete
replacement, and delete-dns-record for one exact record. Every mutation must complete its declared auth:password
authorization before observing an access token or contacting Cloudflare. Never claim success beyond the returned
provider result, silently retry an uncertain write, mutate a zone, or ask the user to paste OAuth credentials.
"""
[shimpz.links]
site = "https://shimpz.com/"
github = "https://github.com/TheShimpz"
[network]
allowed_hosts = ["api.cloudflare.com"]
[integrations.cloudflare]
scopes = ["zone.read", "dns.read", "dns.write", "offline_access"]Describe one Assistant under [shimpz]
[shimpz]- The required parent table for identity, publication disclosure, and Genesis.
spec- The integer
1. No other Assistant Spec version is supported. id- A stable identifier of 1 to 40 characters: lowercase letters and digits in hyphen-separated
segments, starting with a letter. It is independent of repository and Python project names.
postgres,assistant-egress, andshimpz-assistant-egressare reserved. version- A stable semantic version such as
0.1.0. name- A display name from 1 to 80 characters, without surrounding whitespace or line breaks.
summary- A short, single-line outcome description from 1 to 80 characters, shown in full under the Assistant's name. With SDK 0.6.0, it joins the message catalog and is translated with it, so it must be NFC-normalized English without braces, and every translation must fit 80 characters too.
description- A plain-language paragraph from 1 to 400 characters, shown under the summary on the Assistant's page. Write it on one line, without surrounding whitespace. Like the summary, it joins the message catalog and is translated into every interface language, so it must be NFC-normalized English without braces; every translation must fit 500 characters.
creators- One to 16 unique Account-owned Creator handles, each beginning with
@. github- The exact HTTPS URL of the public GitHub repository.
[shimpz.links]- An optional table of the Creator's public pages, shown as the Creator's links on the Assistant's page. Its keys
are
site,github,x,youtube,linkedin, andinstagram, each at most once, and the table needs at least one when it is present. Each value is anhttpsURL of at most 256 characters in the form required forhelp_url, on the kind's own host:github.comforgithub,x.comforx,youtube.comorwww.youtube.comforyoutube,linkedin.comorwww.linkedin.comforlinkedin,instagram.comorwww.instagram.comforinstagram, and any public host forsite. Nothing verifies these links, and they are separate from the repository named bygithubabove. genesis- Bounded behavior and Action-composition guidance loaded by the Brain. Genesis never grants
authority.
help.mdis not part of Assistant Spec v1 and is not loaded as Brain guidance.
Request only what the code needs
[network]- The required parent table for Assistant outbound network intent.
allowed_hosts- A unique list of exact public DNS hostnames. Use
[]for no network access. Schemes, ports, paths, wildcards, IP literals, and private or reserved names are invalid. [integrations.<provider>]- An optional table keyed by a registered provider id. Its only key is a unique, non-empty
scopeslist from that provider's supported catalog. Both the provider and every scope must exist in the current published catalog. Provider endpoints and OAuth client configuration remain Controller-owned. [stored_inputs.<id>]- An optional table for a token-like third-party value that Team keeps encrypted for the Team once a person enters
it, at most eight per manifest. It holds
kind = "password", alabelof 1 to 80 characters, a help-textdescriptionof 1 to 400 characters, and a requiredhelp_url. The description is what a person reads wherever the value is asked for: in plain language, what the secret is and the steps to get it, written for someone who has never made one. The label and the description join the message catalog and are translated like the summary, so both must be NFC-normalized English without braces, and every translation must fit 120 and 500 characters. A provider permission name such asads_readis kept by translation intent, not guaranteed, so the linked page stays the authority. It also declares where Team places the value in provider calls: onehostfromallowed_hosts, exactly oneheader(with an optionalschemesuch as"Bearer") orqueryparameter, and an optionalhmacnaming another Stored Input of the same host, which places the lowercase hexadecimal HMAC-SHA256 keyed by this value over that one, as Meta'sappsecret_proof. Team-owned headers such asHostorContent-Lengthand a field another Stored Input uses on the same host are refused. The requiredrouteslist names the only endpoints on that host that ever receive the value. Each Action names the ids it uses, any number of them, and only its calls carry them; several Actions may share one. See password input. help_url- A required key of a
[stored_inputs.<id>]table: the closest official page where a person creates or finds the value, such as an API key page, or the provider's documentation when making it takes several steps. Admin shows it after the description as one "How to get it" link that opens in a new tab. It must be one canonicalhttpsURL of at most 2,048 characters on a public DNS host, with a path and an optional query, and without a port, credentials, a fragment, or a.or..segment, written exactly as a browser prints it: for examplehttps://dashboard.exa.ai/api-keys, nothttps://dashboard.exa.ai.
Name every endpoint that receives the value
A Stored Input reaches its host only on the calls its routes admit. List each method
and path your Actions send it on, and nothing more: a key that only searches must never travel to an endpoint
that changes billing or reads other credentials.
[stored_inputs.exa-api-key]
kind = "password"
label = "Exa API key"
description = "Lets this Assistant search the web. Create it in the Exa dashboard."
help_url = "https://dashboard.exa.ai/api-keys"
host = "api.exa.ai"
header = "x-api-key"
routes = [{ method = "POST", path = "/search" }, { method = "POST", path = "/contents" }]routes- A required key of a
[stored_inputs.<id>]table: 1 to 32 inline tables{ method, path, query }, with no two sharing the samemethodandpath.queryis optional. method- One of
GET,HEAD,POST,PUT,PATCH, orDELETE. path- At most 512 characters of
/-prefixed segments. A segment is either a literal of 1 to 64 unreserved characters (A-Z,a-z,0-9,-,.,_,~) other than.and.., or*, which matches exactly one segment of 1 to 256 of those characters, such as a numeric object id. There is no root path, empty or trailing segment, partial wildcard such asv*, or wildcard spanning several segments:/v23.0/*/messagesmatches/v23.0/1234567890/messagesbut not/v23.0/1/2/messages. query- Optional selectors for a provider parameter that changes what an endpoint returns or acts on, such as Meta's
fieldson an object that can also return a token. Each is{ name, values }: a name of 1 to 64 unreserved characters, unique without regard to case, and 1 to 16 unique values of at most 256 characters. Write each value exactly as your Action's query encoder sends it, with reserved characters percent-encoded in uppercase hexadecimal: Python'surlencodesendsid,nameasid%2Cname. A call on that route must carry each selector exactly once, under that exact name, with one listed value; other parameters stay free. At most 8 selectors per route.
A route may never name an endpoint that issues, lists, or exchanges credentials. A literal segment is refused
when, lowercased and without -, _, ., and ~, it contains apikey, authoriz, credential, oauth, password, secret, or token, so /v1/api-keys and /oauth/access_token fail validation. Team applies the same test to every segment of each call, so a * never reaches
such an endpoint either.
Team places a credential only when every Stored Input the Action declares for the call's host admits the call. When two Stored Inputs share a host, such as Meta's access token and its app secret, give them the same routes; otherwise a call outside either list is refused before any credential is placed. See how Team matches each call.