Wyrd docs v0.2.0 Reference GitHub

Status: Runnable

MCP tools

The Wyrd server exposes its MCP tools over HTTP at /mcp. wyrd mcp proxy relays the same tools to an agent over stdio and adds none of its own. Connect an agent through MCP covers installation and credentials.

Discovery and authentication

Every request is authenticated in the caller’s tenant. Use tools/list for the current input and output JSON Schemas and effect annotations. Unknown fields in closed argument objects are refused. IDs and versions below are exact discovered values, not names inferred from a prompt.

Read tools and wyrd.guide are always advertised. Principal revocation, verification execution/run creation, Operator connection writes, and gateway writes, revocation, resets, and deletions are advertised only to callers with their required write or delete permission. Advertising a tool grants no permission; naming a hidden write tool does not bypass authorization.

The tables below summarize wire shapes. Named shapes such as ExecuteVerificationRequest or OperatorConnectionView are the JSON Schemas tools/list returns for that tool; use them for every nested field, enum, and bound. A {} input means an empty argument object. Credentials and connection secrets are never returned.

Agent frameworks

Wyrd serves MCP protocol revision 2026-07-28 only. Its MCP tool names contain dots and do not change. Model providers commonly accept only ^[a-zA-Z0-9_-]{1,64}$ as a function-tool name, so each framework below forwards a model-facing alias instead; its own MCP client still calls the dotted Wyrd tool and surfaces Wyrd’s refusals as tool errors. These are the configurations Wyrd’s framework journeys test.

FrameworkTested configuration
OpenAI Agents SDK (Python)mcp_config={"convert_schemas_to_strict": True, "include_server_in_tool_names": True} forwards aliases such as mcp_wyrd__wyrd_guide.
Pydantic AIMCPToolset(url, headers=...).renamed({"wyrd_guide": "wyrd.guide", ...}), one entry per discovered tool.
Google ADKSet ADK_ENABLE_MCP_MODERN_PROTOCOL=1 (experimental in ADK) to negotiate 2026-07-28, and GOOGLE_API_USE_CLIENT_CERTIFICATE=false to skip ADK’s Google Cloud mTLS probe. ADK has no renaming option and declares the dotted names as they are, so override McpToolset.get_tools to return shallow copies whose name is the alias; ADK still calls each copy’s original MCP tool.

Investigation guide

ToolEffect / permissionInput → outputPurpose
wyrd.guideRead; authenticated{topic} → {topic, steps, examples}Static guidance; reads no tenant data and grants no permission

topic is one of start, overview, cards, verification, bifrost_sql. start teaches an unfamiliar coding agent the Declare → Observe → Verify workflow on its own application: the CLI commands and SDK operations it runs from a shell, the docs to read, and the server evidence that shows it is done. The server’s initialization instructions point new agents to it. Each example contains tool, purpose, and an arguments object. Replace angle-bracket placeholders with discovered identities and adjust example time windows. The guide is a workflow aid; tools/list remains the current schema authority.

Cards and verification

ToolEffect / permissionInput → outputPurpose
cards.listRead; cards:readList filters and optional cursor → {items, next_cursor}Discover metadata summaries by kind, name, space, version range, lifecycle status, or metadata filter
cards.getRead; cards:read{card_ref} or {kind, card_uid} → {card, created_at, updated_at}Read one Card by exact kind, name, version, and space, or by kind and UID; pass exactly one form
verification.get_bindingRead; cards:read{binding_id} → binding statusInspect owner, subject, Verifier, readiness, and latest admitted last_execution_id
verification.get_executionRead; cards:read{execution_id} → execution statusInspect state, result, error, and Operator dispatches of one execution
verification.evidenceExecute; verifier:run{files: [{sha256, size_bytes}]} → {uploads}Plan presigned uploads for evidence files the tenant does not already hold
verification.executeExecute; verifier:run on exact VerifierVerifier, subject, optional run_id, and named input declarations → VerificationResultReturn the result in the same call and store it; creates no queued execution or Operator dispatch
verification.enqueueExecute; verifier:run on exact VerifierThe verification.execute arguments plus optional idempotency_key → {execution_id}Accept the execution without waiting; poll verification.get_execution. A just-enqueued execution may read as not found until the queue accepts it

cards.list.filter is a metadata query string, not a JSON object: for example labels.env = "prod", labels.tier in ["gold","silver"], or labels.deprecated not exists, combined with and, or, and not. Fields are labels.<key>, annotations.<key>, and attributes.<key>; a query may hold up to 64 predicates. A syntax error returns WYRD_QUERY_400_INVALID_SYNTAX. Preserve next_cursor unchanged alongside the same filters. A missing version or malformed cursor is invalid; no implicit newest-version or fuzzy selection occurs. Missing and foreign-tenant Cards are indistinguishable. Relationship edges in outbound_refs and inbound_refs carry exact identities under ref.

verification.execute refuses a Verifier that judges a scheduled window; drift is judged only by its schedule. Follow the verification procedure to read persisted results.

Bifrost

ToolEffect / permissionInput → outputPurpose
bifrost.list_tablesRead; bifrost_table:read{} → {tables}List tenant-authorized namespace, name, status entries
bifrost.describe_tableRead; bifrost_table:read{namespace, name} → table descriptionRead user fields, managed fields, partitioning, sorting, and Bloom columns
bifrost.queryRead; scoped bifrost_query:read{sql, deadline_ms?, max_rows?, max_bytes?} → {columns, rows, terminal}Run one complete bounded SELECT over authorized tables

Schema/table object grants restrict the query to the allowed objects. Gateway request/response payload columns also require gateway_payload:read. Catalog listing and schema description require bifrost_table:read; query grants separately decide which objects can be read. Sensitive metadata on verification or trace columns is descriptive; table query permission governs those columns.

Query limits

BoundDefaultMaximum
SQL textRequired65,536 UTF-8 bytes
max_rows1,00010,000
max_bytes4 MiB16 MiB
deadline_msServer policy4,294,967,295 ms; minimum 1

Use DataFusion SQL: one SELECT, explicit projections, fully qualified discovered names, appropriate time bounds, and LIMIT. Caller identity, tenant, execution path, query class, topology, and plan are server-owned and cannot be supplied as arguments.

columns describes the ordered projection; each row is a positional array in that order. Require terminal.outcome: "success" before reporting a complete result. Empty rows are absence of matches. Exceeding a row/byte ceiling refuses the result rather than truncating it; errors contain no partial successful rows. See the Bifrost procedure for runnable writes and queries.

Principal credentials

ToolEffect / permissionInput → outputPurpose
principals.list_credentialsRead; service_accounts:write{principal_id} → CredentialListResponseRead nonsecret metadata including expired/revoked credentials
principals.revoke_credentialWrite; service_accounts:write{principal_id, credential_id} → CredentialRevokedPrevent further token issuance from that credential

A token already minted from a revoked credential lapses within five minutes. The principal, its roles, and other credentials remain. Unknown or foreign-tenant identities are refused; secret material is never disclosed.

Operator connections

ToolEffect / permissionInput → outputPurpose
operator_connections.listRead; operators:read{} → {connections}List redacted connection metadata
operator_connections.getRead; operators:read{connection_id} → OperatorConnectionViewRead one connection
operator_connections.createWrite; operators:write{request: CreateOperatorConnectionRequest} → OperatorConnectionViewCreate provider-tagged Slack, PagerDuty, or HTTP configuration
operator_connections.updateWrite; operators:write{connection_id, request} → OperatorConnectionViewPatch configuration, secret, or status; provider/name remain fixed
operator_connections.disableWrite; operators:write{connection_id} → OperatorConnectionViewRetain the connection in disabled state

Provider-specific invalid configuration, missing connection IDs, and permission denials are refused. Updates preserve omitted fields. Secrets are encrypted at rest and redacted from every response.

Gateway administration

Gateway tools address resources in the authenticated tenant by exact name. They do not invoke a model. Reads require gateway:read, replacements/revocation/policy resets require gateway:write, and credential/deployment deletion requires gateway:delete.

ToolEffect / permissionInput → outputPurpose
gateway.list_provider_credentialsRead; gateway:read{} → {items} of credential viewsList redacted sources, states, timestamps
gateway.list_provider_deploymentsRead; gateway:read{} → {items} of deploymentsList model adapters, credential names, capabilities, weights
gateway.get_provider_credentialRead; gateway:read{name} → credential viewRead one redacted credential
gateway.get_provider_deploymentRead; gateway:read{name} → deploymentRead one deployment
gateway.get_fallback_policyRead; gateway:read{} → fallback policyRead effective routing fallback
gateway.get_governance_policyRead; gateway:read{} → governance policyRead limits, budgets, pricing, unknown-cost policy
gateway.get_capture_policyRead; gateway:read{} → versioned capture policyRead payload capture configuration
gateway.put_provider_credentialWrite; gateway:writeProviderCredentialWrite → credential viewCreate or rotate an operator/external binding or write-only managed secret
gateway.put_provider_deploymentWrite; gateway:writeProviderDeployment → deploymentCreate or replace a deployment
gateway.apply_provider_deploymentsWrite; gateway:writeProviderDeploymentsApply → applied credentials and deploymentsCreate or rotate credentials and create or replace deployments in one transaction; secrets are write-only
gateway.put_fallback_policyWrite; gateway:writeFallbackPolicy → fallback policyReplace routing fallback
gateway.put_governance_policyWrite; gateway:writeGovernancePolicy → governance policyReplace limits, budgets, pricing
gateway.put_capture_policyWrite; gateway:writeCapturePolicyWrite → versioned capture policyReplace payload capture configuration
gateway.revoke_provider_credentialWrite; gateway:write{name} → credential viewTerminally revoke; repeated calls retain that state
gateway.delete_provider_credentialDelete; gateway:delete{name} → {}Delete an unreferenced credential; absence succeeds
gateway.delete_provider_deploymentDelete; gateway:delete{name} → {}Delete a deployment; absence succeeds
gateway.delete_fallback_policyReset; gateway:write{} → {}Restore default fallback policy
gateway.delete_governance_policyReset; gateway:write{} → {}Restore default governance policy

Gateway schemas bound managed secret input and validate provider capabilities and policy values. Never paste a provider secret into an investigation prompt. A managed secret is accepted only for writing and never readable again. Credentials still referenced by deployments cannot be deleted. Wrong names, invalid configurations, and missing scopes return structured Wyrd errors.

Errors and evidence

A tool can return a JSON-RPC error carrying a Wyrd problem, or an isError result with a structured problem body. Read its stable code, status, and remediation rather than treating transport success as operation success. Bifrost runtime refusals use the structured result form; malformed arguments may fail at the protocol boundary.

Common query refusals include permission denial, non-SELECT admission, unknown columns/tables, deadline failure, and WYRD_VALA_413_QUERY_RESULT_TOO_LARGE. Retry only when the problem’s remediation warrants it. A failed or incomplete query supplied no complete evidence. State uncertainty and absence of retained results explicitly.

Last updated