service-integration
connect is the only goodvibes server that holds credentials, so it is deliberately conservative.
This skill is the usage guide for its three tools and the trust model they enforce. If you only
need to read a public web page or hit a one-off unauthenticated URL, use the native WebFetch
tool instead — connect is not a general web reader.
The three tools
| Tool | Use it for |
|---|---|
| mcp__connect__service | Registry CRUD: register/remove services and DB connections, store credentials, set read-only vs write access, manage the destination allowlist, report trust status. |
| mcp__connect__api_request | One or more HTTP requests to a registered service (or an allowlisted URL). Batched, per-entry error isolation, response capping, secret redaction on echoed responses. |
| mcp__connect__db_query | A SQL query against a registered Postgres / MySQL / SQLite connection. Read-only by default; drivers resolve from the target project. |
The /goodvibes:services command is a guided wrapper over the service tool for the common
registry operations.
Trust model (enforced by the server)
- Credentials are pinned to their registered origin (protocol + host + port) and never sent elsewhere. Not toggleable — open mode widens where you may go, never where secrets may travel.
- Destination allowlist is on by default. In restricted mode a destination is reachable only if
its origin is a registered service origin or its host is on the allowlist. An unregistered,
non-allowlisted
url(api_request) or a baredatabase_url(db_query) is refused. - Read-only by default. HTTP write methods (anything beyond GET/HEAD/OPTIONS) require the
service's
write_methodsopt-in;db_querywrites requirewrite: trueAND a target that permits writes (a connectionallow_writesopt-in, or open mode for a baredatabase_url). - Open (unrestricted) mode is human-only and out-of-band — a person edits
.goodvibes/config.json, it is announced at session start, and it reverts to restricted the next session unless the separate, louddangerously_persist_across_sessionsflag is set. Agents cannot enable it. - Every response carries a
mode: restricted | openstamp. - Secrets are write-only.
set_authstores at mode 0600 and never echoes the value back;getreturns an auth STATUS, andlist/statusreturn names and summaries only — never the secret.
Typical flow
servicestatus— check the current mode and what is already registered.serviceregister— register the API service (config.base_urlrequired). Addwrite_methodsonly if the service needs non-GET methods.serviceset_auth— store the credential (0600, never echoed). Prefer{ "$env": "VAR_NAME" }env references over a literal secret value.api_request— call the registered service byservicename +path(or an allowlistedurl). Batch related calls; each result is keyed byid(or array index) and error-isolated. Chooseextract: json | text | headers | status (default json). An entry may carry a per-requestauthoverride (none|bearer|basic|api-key|custom-headers), applied to the headers when the request is built — useful for one-off credentials on allowlisted URLs. It is caller-supplied, not origin-pinned; for an origin-matched registered service the stored credential is applied after it and wins on the same header (usuallyAuthorization).- For databases:
serviceregister_connection(urlfor a secret-free target such as a SQLite file, orurl_envnaming an env var that holds the connection URL), thendb_querywith theconnectionname. SELECT/WITH queries auto-LIMIT (default 100); passwrite: trueonly for a connection registered withallow_writes.
Credential hygiene
- Never paste a raw secret into a prompt or a committed file. Use a
{ "$env": "VAR_NAME" }env reference in theauthobject, orurl_envfor a database connection. - The connect commit-guard hook warns once, then blocks, on a
git add/commitof a known credential file — do not work around it; move the secret out of the tree. - Removing a service (
serviceremove) purges its stored credentials.