Safe-MPC
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DRY_RUN | No | When true, every vote tool returns the exact payload it would have submitted without signing anything. Off by default; setup writes DRY_RUN=false. | false |
| SAFE_ADDRESS | Yes | The Safe smart-account wallet address the server votes as. | |
| SAFE_API_KEY | No | Free API key from developer.safe.global used by the Safe SDK's Transaction Service client. Required unless SAFE_TX_SERVICE_URL is set. | |
| SAFE_RPC_URL | Yes | RPC URL for the chain the Safe is deployed on. | |
| AGENT_COMMAND | No | Command the watcher runs to decide and vote on a due proposal. Parsed into an argument list and run without a shell; supports {prompt}, {platform}, {proposalId}, {venue} and {endsAt} placeholders. | |
| POLL_INTERVAL | No | How often the watcher polls for new proposals when running continuously. | 1h |
| SAFE_CHAIN_ID | Yes | The chain ID the Safe is deployed on (e.g. 1 for Ethereum mainnet). | |
| WATCH_GOVERNORS | No | Comma-separated Governor contract addresses the scheduler polls for open on-chain proposals. | |
| ALLOWED_GOVERNORS | No | Comma-separated allowlist of Governor contract addresses. Anything else is refused before a signature is made. | |
| GOVERNOR_LOOKBACK | No | Fallback log scan window for Governor forks that do not expose votingDelay and votingPeriod. | |
| VOTE_BEFORE_CLOSE | No | How long before a proposal's deadline the scheduler dispatches the agent to decide and vote. | 6h |
| SAFE_TX_SERVICE_URL | No | URL of a self-hosted Safe Transaction Service, used as an alternative to SAFE_API_KEY. | |
| SNAPSHOT_TEST_SPACE | No | Snapshot space that is always tested and watched so a fresh install can exercise the whole voting path. Set empty to drop it. | staging.daoplomats.eth |
| WATCH_SNAPSHOT_AUTO | No | When true (the default), the scheduler re-resolves watched Snapshot spaces on every pass to wherever the Safe has voting power. | true |
| WATCH_SNAPSHOT_SPACES | No | Comma-separated Snapshot spaces to watch explicitly, even at zero voting power. | |
| SAFE_AGENT_PRIVATE_KEY | Yes | Private key of the agent's EOA, which must be added as an owner of the Safe. | |
| ALLOWED_SNAPSHOT_SPACES | No | Comma-separated allowlist of Snapshot space IDs. When set, spaces outside it are never tested, watched, or voted in. | |
| GOVERNOR_MAX_LOG_CHUNKS | No | Maximum number of eth_getLogs calls a Governor proposal scan may make before it is refused. | |
| GOVERNOR_LOOKBACK_MARGIN | No | Extra time added to the Governor-derived log scan window (votingDelay + votingPeriod) when discovering on-chain proposals. | |
| GOVERNOR_LOG_CHUNK_BLOCKS | No | Block span used per eth_getLogs call when scanning Governor ProposalCreated logs. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| safe_infoA | Reports the configured Safe and the agent's readiness to vote: chain, owners, threshold, nonce, both ETH balances, and whether the agent's signer key is an owner that can execute alone. The agent's own balance is what pays gas for on-chain votes; Snapshot votes are gasless and need none. Call this first. |
| safe_pending_transactionsA | Lists transactions queued on the Safe Transaction Service that are waiting for confirmations or execution. |
| safe_confirm_transactionA | Adds the agent's signature to a queued Safe transaction. When this signature meets the threshold, the transaction is executed on-chain. Use this to help along a vote that was proposed but not yet executed. |
| snapshot_spaces_with_voting_powerA | Finds every Snapshot space where the Safe holds voting power, without needing a list up front: it tests the configured spaces, the spaces the Safe follows, and the spaces it has voted in before. Start here when you do not know where this Safe votes. |
| snapshot_open_proposalsA | Lists the proposals currently open for voting across every Snapshot space the Safe holds voting power in, soonest deadline first, with the Safe's voting power on each. This is the whole of the Safe's Snapshot ballot: use it to decide what needs a vote, then snapshot_get_proposal to read one. |
| snapshot_queryA | Runs any GraphQL query against the Snapshot hub API — spaces, proposals, votes, follows, users, strategies, anything the schema exposes — for questions the fixed read tools do not cover (a space's full vote history, who follows it, strategy parameters, cross-space voter lookups). The tool only sends query operations — mutations and subscriptions are rejected. Use |
| snapshot_list_proposalsA | Lists proposals in a Snapshot space, newest first. Defaults to proposals that are currently open for voting. |
| snapshot_get_proposalA | Fetches a Snapshot proposal in full, including the body text, the voting system, every choice with its index, current scores, and how much voting power the Safe holds. Read this before voting. |
| snapshot_voting_powerA | Reports how much voting power the Safe has on a specific proposal, broken down by the space's strategies. Zero means the vote would carry no weight. |
| snapshot_voteA | Casts an off-chain, gasless Snapshot vote on behalf of the Safe. Signs an EIP-712 vote as a Safe message, waits for the Safe's EIP-1271 signature, then submits it to the Snapshot sequencer. Read the proposal with snapshot_get_proposal first so the choice index and voting system match. Voting again on the same proposal replaces the earlier vote. |
| snapshot_submit_pending_voteA | Finishes a vote whose Safe message was created earlier but not submitted, usually because the Safe needed more owner signatures. Pass the safeMessageHash reported by snapshot_vote. |
| snapshot_x_proposalA | Reads a Snapshot X (snapshot.box) proposal straight from its space contract: live status, the running For/Against/Abstain tally, the Safe's voting power at the proposal's snapshot block, whether the Safe already voted, and whether this Safe is the space controller that could cancel it. Use it before snapshot_x_vote or snapshot_x_cancel_proposal, and again afterwards to confirm the vote landed or the proposal shows Cancelled. |
| snapshot_x_voteA | Votes For, Against or Abstain on a Snapshot X (snapshot.box) proposal as the Safe. The Safe calls the space's EthTx authenticator, which forwards Space.vote with the Safe as voter — the path snapshot.box itself uses for smart-contract wallets, since a Safe cannot produce the gasless EIP-712 signature. This is an on-chain transaction: it costs gas and is final, Snapshot X does not allow changing a vote. The Safe's voting strategies are resolved automatically and the vote is simulated from the Safe before anything is signed. Read the proposal with snapshot_x_proposal first. |
| snapshot_x_cancel_proposalA | Cancels (vetoes) an on-chain Snapshot X proposal by proposing Space.cancel(proposalId) from the Safe — the streamlined replacement for wiring snapshot.box to the Safe over WalletConnect by hand. Only works when the Safe is the space controller. At threshold 1 the transaction executes immediately; above that it lands in the Safe queue with the exact to/data/value for the other owners to verify and sign, and the final signer's confirmation executes it. |
| governor_find_proposalsA | Discovers proposals by reading ProposalCreated logs straight from a Governor contract, then filtering by the contract's live state. Returns the full proposal description, so no third-party indexer is involved. This is the supported way to find on-chain proposals: Tally shut down in March 2026. Works with OpenZeppelin Governor and Compound Bravo. |
| governor_list_proposalsA | Legacy path: lists proposals through the Tally-compatible hosted API. Tally shut down in March 2026 and is now Cactus, so this may fail even with a key. Prefer governor_find_proposals, which reads the Governor contract directly and needs no API key. |
| governor_get_proposalA | Legacy path: fetches a proposal's title, description and tallies from the Tally-compatible hosted API, which shut down in March 2026. Prefer governor_find_proposals for the description and governor_proposal_state for live on-chain state; neither needs an API key. |
| governor_proposal_stateA | Reads the Governor contract directly: the proposal's state, whether the Safe has already voted, the Safe's voting power at the proposal's snapshot, the quorum and the running tally. Needs no API key. Call this before voting. |
| governor_voteA | Votes on an OpenZeppelin or Compound-style Governor by executing castVoteWithReason from the Safe. This is a real on-chain transaction that costs gas and cannot be undone or changed. Check governor_proposal_state first to confirm the proposal is Active and the Safe has voting power. |
| vote_logA | Returns votes this Safe has already cast through Safe-MPC, newest first, with the choice and the reason given. Read it before deciding so the Safe votes consistently with its own precedent, and to check whether a proposal has already been handled. |
| vote_scheduleA | Shows proposals the watcher has queued for a decision, when each is due, and which are due now. Populated by safe-mpc-watch; empty if the watcher is not running. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| vote_on_snapshot_proposal | Walks through reading, judging and casting a Snapshot vote from the Safe, against the operator's configured voting policy. |
| vote_on_governor_proposal | Walks through reading, judging and casting an on-chain Governor vote from the Safe, against the operator's configured voting policy. |
| vote_on_every_open_proposal | Finds every Snapshot space the Safe holds voting power in, then decides and casts a vote on each proposal open there, against the operator's policy. |
| review_open_proposals | Surveys the open proposals in a Snapshot space — or in every space the Safe can vote in — and recommends a vote on each one, without casting anything. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| payload-watch | An operating-values or precedent document the Safe's operator wrote to govern how the agent votes. |
TDQS
Scored across 21 tools
Most tools target a clearly distinct resource and voting path (Safe queue, Snapshot off-chain, Snapshot X on-chain, Governor). There is some potential overlap among Snapshot read tools and among the several vote-casting tools, plus legacy Governor read tools, but descriptions usually make the intended path clear.
All names use snake_case and most are grouped by domain prefix (safe_, snapshot_, governor_). However, several are noun phrases rather than verb_noun, and vote_log/vote_schedule lack the domain prefix used elsewhere, so the pattern is not fully uniform.
At 21 tools the surface is heavy, though some size is justified by supporting three different voting systems. Legacy Governor read tools and the generic snapshot_query add breadth that could likely be consolidated.
The voting lifecycle is well covered: discover spaces/proposals, inspect state and voting power, cast votes, confirm Safe transactions, and review past votes. Minor gaps remain around generic Safe transaction proposal/execution and Governor queue/execute operations, but core Safe voting workflows are supported.