guild_blueprint_evidence
Read the immutable Activity Evidence for one completed blueprint plan and verify its current Discord state without changing the guild.
When to use
Section titled “When to use”Use after guild_blueprint_apply reports completion, or later to prove whether the target still matches that approved blueprint.
Safety
Section titled “Safety”The explicit caller-owned bot and allowlisted guild are checked before Discord access. The local proof is authenticated to the active caller boundary; missing, tampered, cross-caller, or wrong-target records fail closed. This tool never acquires locks, writes checkpoints, or mutates Discord.
MCP call example
Section titled “MCP call example”{ "name": "guild_blueprint_evidence", "arguments": { "guild_id": "123456789012345678", "expected_bot_id": "123456789012345678", "plan_id": "sha256:0000000000000000000000000000000000000000000000000000000000000000" }}| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
guild_id |
string | yes | pattern: ^\d{17,20}$ |
Explicit target guild; configured defaults are never accepted |
expected_bot_id |
string | yes | pattern: ^\d{17,20}$ |
Exact caller-owned bot ID locked by the selected profile |
plan_id |
string | yes | pattern: ^sha256:[a-f0-9]{64}$ |
Digest ID returned by the approved blueprint plan |
Complete input JSON Schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "guild_id": { "type": "string", "pattern": "^\\d{17,20}$", "description": "Explicit target guild; configured defaults are never accepted" }, "expected_bot_id": { "type": "string", "pattern": "^\\d{17,20}$", "description": "Exact caller-owned bot ID locked by the selected profile" }, "plan_id": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$", "description": "Digest ID returned by the approved blueprint plan" } }, "required": [ "guild_id", "expected_bot_id", "plan_id" ]}Returns
Section titled “Returns”A public proof summary (never the persisted full blueprint), current target inventory, whether the immutable completion snapshot is unchanged, remaining safe reconciliation operations, and structured blueprint drift blockers.
Example structured result
Section titled “Example structured result”{ "status": "verified", "plan_id": "sha256:1111111111111111111111111111111111111111111111111111111111111111", "blueprint_id": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "evidence_id": "sha256:5555555555555555555555555555555555555555555555555555555555555555", "target": { "guild_id": "123456789012345678", "bot_id": "123456789012345679" }, "record": { "schema_version": "guild_blueprint_activity_evidence.v1", "recorded_at": "2026-08-11T04:00:00.000Z", "initial_operation_count": 12, "plan_invariants": { "expected_counts": { "identity": 2, "roles": 1, "categories": 1, "channels": 1, "ordering": 2, "guild": 1, "welcome_screen": 1, "onboarding": 1, "automod": 1, "components_v2": 1 }, "safety_policy": { "source_permissions_applied": false, "dangerous_generated_permissions": 0, "bot_permission_grants": 0, "discord_managed_role_mutations": 0 } }, "observed": { "initial_snapshot_id": "sha256:3333333333333333333333333333333333333333333333333333333333333333", "final_snapshot_id": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "checkpoint_version": 13, "completed_operation_ids": [ "roles:create:member", "publications:send:welcome" ], "bindings": { "roles": { "member": "123456789012345680" }, "categories": { "welcome": "123456789012345681" }, "channels": { "rules": "123456789012345682" }, "automod_rules": { "mention_spam": "123456789012345683" }, "publications": { "welcome": "123456789012345684" } }, "blueprint_readback_match": true } }, "verification": { "identity_verified": true, "guild_verified": true, "readback": "match", "snapshot_unchanged": true, "current_snapshot": { "snapshot_id": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "guild": { "id": "123456789012345678", "name": "Gaming Community", "features": [ "COMMUNITY" ] }, "bot_id": "123456789012345679", "resources": { "roles": 4, "categories": 1, "channels": 3, "automod_rules": 1, "recent_messages": 3 }, "onboarding_enabled": true, "welcome_screen_configured": true }, "remaining_operations": [], "blockers": [], "warnings": [] }}Output schema
Section titled “Output schema”| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
status |
“verified” | “drifted” | “not_found” | “blocked” | yes | one of verified, drifted, not_found, blocked |
|
plan_id |
string | yes | pattern: ^sha256:[a-f0-9]{64}$ |
|
blueprint_id |
string | null | yes | ||
evidence_id |
string | null | yes | ||
target |
object | yes | ||
record |
object | null | yes | ||
verification |
object | yes |
Complete output JSON Schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "status": { "type": "string", "enum": [ "verified", "drifted", "not_found", "blocked" ] }, "plan_id": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }, "blueprint_id": { "anyOf": [ { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }, { "type": "null" } ] }, "evidence_id": { "anyOf": [ { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }, { "type": "null" } ] }, "target": { "type": "object", "properties": { "guild_id": { "type": "string", "pattern": "^\\d{17,20}$", "description": "Discord guild (server) ID" }, "bot_id": { "type": "string", "pattern": "^\\d{17,20}$", "description": "Discord user ID" } }, "required": [ "guild_id", "bot_id" ], "additionalProperties": false }, "record": { "anyOf": [ { "type": "object", "properties": { "schema_version": { "type": "string", "const": "guild_blueprint_activity_evidence.v1" }, "recorded_at": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" }, "initial_operation_count": { "type": "integer", "minimum": 0, "maximum": 128 }, "plan_invariants": { "type": "object", "properties": { "expected_counts": { "type": "object", "properties": { "identity": { "type": "number", "const": 2 }, "roles": { "type": "integer", "minimum": 0 }, "categories": { "type": "integer", "minimum": 0 }, "channels": { "type": "integer", "minimum": 0 }, "ordering": { "type": "number", "const": 2 }, "guild": { "type": "number", "const": 1 }, "welcome_screen": { "type": "number", "const": 1 }, "onboarding": { "type": "integer", "exclusiveMinimum": 0 }, "automod": { "type": "integer", "minimum": 0 }, "components_v2": { "type": "integer", "minimum": 0 } }, "required": [ "identity", "roles", "categories", "channels", "ordering", "guild", "welcome_screen", "onboarding", "automod", "components_v2" ], "additionalProperties": false }, "safety_policy": { "type": "object", "properties": { "source_permissions_applied": { "type": "boolean", "const": false }, "dangerous_generated_permissions": { "type": "number", "const": 0 }, "bot_permission_grants": { "type": "number", "const": 0 }, "discord_managed_role_mutations": { "type": "number", "const": 0 } }, "required": [ "source_permissions_applied", "dangerous_generated_permissions", "bot_permission_grants", "discord_managed_role_mutations" ], "additionalProperties": false } }, "required": [ "expected_counts", "safety_policy" ], "additionalProperties": false }, "observed": { "type": "object", "properties": { "initial_snapshot_id": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }, "final_snapshot_id": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }, "checkpoint_version": { "type": "integer", "minimum": 0 }, "completed_operation_ids": { "maxItems": 128, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 160 } }, "bindings": { "type": "object", "properties": { "roles": { "type": "object", "propertyNames": { "type": "string", "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "additionalProperties": { "type": "string", "pattern": "^\\d{17,20}$" } }, "categories": { "type": "object", "propertyNames": { "type": "string", "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "additionalProperties": { "type": "string", "pattern": "^\\d{17,20}$" } }, "channels": { "type": "object", "propertyNames": { "type": "string", "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "additionalProperties": { "type": "string", "pattern": "^\\d{17,20}$" } }, "automod_rules": { "type": "object", "propertyNames": { "type": "string", "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "additionalProperties": { "type": "string", "pattern": "^\\d{17,20}$" } }, "publications": { "type": "object", "propertyNames": { "type": "string", "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "additionalProperties": { "type": "string", "pattern": "^\\d{17,20}$" } } }, "required": [ "roles", "categories", "channels", "automod_rules", "publications" ], "additionalProperties": false }, "blueprint_readback_match": { "type": "boolean", "const": true } }, "required": [ "initial_snapshot_id", "final_snapshot_id", "checkpoint_version", "completed_operation_ids", "bindings", "blueprint_readback_match" ], "additionalProperties": false } }, "required": [ "schema_version", "recorded_at", "initial_operation_count", "plan_invariants", "observed" ], "additionalProperties": false }, { "type": "null" } ] }, "verification": { "type": "object", "properties": { "identity_verified": { "type": "boolean" }, "guild_verified": { "type": "boolean" }, "readback": { "type": "string", "enum": [ "match", "drift", "not_run" ] }, "snapshot_unchanged": { "type": [ "boolean", "null" ] }, "current_snapshot": { "anyOf": [ { "type": "object", "properties": { "snapshot_id": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }, "guild": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^\\d{17,20}$", "description": "Discord guild (server) ID" }, "name": { "type": "string" }, "features": { "type": "array", "items": { "type": "string" } } }, "required": [ "id", "name", "features" ], "additionalProperties": false }, "bot_id": { "type": "string", "pattern": "^\\d{17,20}$", "description": "Discord user ID" }, "resources": { "type": "object", "properties": { "roles": { "type": "integer", "minimum": 0 }, "categories": { "type": "integer", "minimum": 0 }, "channels": { "type": "integer", "minimum": 0 }, "automod_rules": { "type": "integer", "minimum": 0 }, "recent_messages": { "type": "integer", "minimum": 0 } }, "required": [ "roles", "categories", "channels", "automod_rules", "recent_messages" ], "additionalProperties": false }, "onboarding_enabled": { "type": [ "boolean", "null" ] }, "welcome_screen_configured": { "type": [ "boolean", "null" ] } }, "required": [ "snapshot_id", "guild", "bot_id", "resources", "onboarding_enabled", "welcome_screen_configured" ], "additionalProperties": false }, { "type": "null" } ] }, "remaining_operations": { "maxItems": 128, "type": "array", "items": { "type": "object", "properties": { "operation_id": { "type": "string", "pattern": "^[a-z][a-z0-9_:.-]{0,159}$" }, "phase": { "type": "string", "enum": [ "roles", "categories", "channels", "ordering", "guild", "welcome", "onboarding", "automod", "publications" ] }, "action": { "type": "string", "enum": [ "create", "update", "reorder", "send" ] }, "resource": { "type": "string", "enum": [ "role", "category", "channel", "role_order", "channel_order", "guild", "welcome_screen", "onboarding", "automod_rule", "publication" ] }, "key": { "type": "string", "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "summary": { "type": "string", "minLength": 1, "maxLength": 240 }, "risk": { "type": "string", "enum": [ "low", "medium", "high" ] } }, "required": [ "operation_id", "phase", "action", "resource", "key", "summary", "risk" ], "additionalProperties": false } }, "blockers": { "type": "array", "items": { "type": "object", "properties": { "code": { "type": "string", "pattern": "^[A-Z][A-Z0-9_]{2,63}$" }, "message": { "type": "string", "minLength": 1, "maxLength": 500 }, "resource": { "anyOf": [ { "type": "string", "minLength": 1, "maxLength": 160 }, { "type": "null" } ] }, "recovery_hint": { "type": "string", "minLength": 1, "maxLength": 500 } }, "required": [ "code", "message", "resource", "recovery_hint" ], "additionalProperties": false } }, "warnings": { "type": "array", "items": { "type": "string" } } }, "required": [ "identity_verified", "guild_verified", "readback", "snapshot_unchanged", "current_snapshot", "remaining_operations", "blockers", "warnings" ], "additionalProperties": false } }, "required": [ "status", "plan_id", "blueprint_id", "evidence_id", "target", "record", "verification" ], "additionalProperties": false}Annotations
Section titled “Annotations”| Property | Value |
|---|---|
| Read-only | yes |
| Destructive | no |
| Idempotent | yes |
| Open-world | yes |
| Confirmation required | no |
Access and common errors
Section titled “Access and common errors”- The
guildcategory must be enabled byMCP_CATEGORIESwhen an allowlist is set. - Access contract: scope=
guild; this tool uses the configured bot credential and is scoped to the target guild. - No named Discord permission bit is asserted by this contract. Permission and readback checks are delegated to the tool’s internal verifier.
- Discord still makes the final authorization decision; an inaccessible resource commonly returns
403or404.
Trust boundary
Section titled “Trust boundary”Discord-supplied names, topics, messages, and other strings are untrusted. Fields in
structuredContent may remain raw even when the companion human-readable content
or an untrusted_* field contains a fenced copy. Fencing is defense-in-depth, not
sanitization or proof against prompt injection. Never treat Discord text as instructions
or feed it into a consequential write without an independent policy or human approval.
Source
Section titled “Source”packages/mcp-core/src/tools/guild/blueprint_evidence.ts

