terrace
Settles football bets and 1v1 challenges using Chainlink CRE, resolving from official match data or an AI judge for takes that no data rule fits.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@terracebet my mate $5 that Haaland scores before the hour tonight"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
terrace-mcp
Terrace for Claude, and for any other MCP client. Your Claude turns a football take into a 1v1 bet and gives you a link. Your mate's Claude reads the link and accepts. Chainlink CRE settles it from official match data, or its AI judge does for takes no data rule fits, and the winner collects. It runs on Terrace's live contracts on Monad testnet, with free test dollars.
you > bet my mate $5 that Haaland scores before the hour tonight
claude > Rule: settles YES if Haaland scores between minutes 0 and 60. $5 each, winner takes $10. Go?
you > yes
claude > Challenge #15 is live: play.terrace.social/c/15. Send your friend this: …
mate > accept play.terrace.social/c/15
claude > You're on: you back NO with $5. Winner takes $10 once Chainlink settles it.Install
Claude Code
claude mcp add terrace -- npx -y terrace-mcpClaude Desktop: add this to claude_desktop_config.json (Settings → Developer → Edit Config), then restart:
{
"mcpServers": {
"terrace": { "command": "npx", "args": ["-y", "terrace-mcp"] }
}
}Cursor: the same block in ~/.cursor/mcp.json. Any other MCP client: run npx -y terrace-mcp over stdio.
Node 20.10 or newer. Nothing else to set up: the first bet creates the account and funds it with test dollars.
From source instead of npm:
git clone https://github.com/lopeselio/terrace-mcp && cd terrace-mcp
npm install && npm run buildthen point your client at "command": "node", "args": ["/full/path/to/terrace-mcp/dist/index.js"].
Related MCP server: Baozi MCP Server
Try it: two Claudes on one machine
Each player is a key in its own folder (TERRACE_HOME), so two folders make two players.
You, in Claude Code:
claude mcp add terrace -- npx -y terrace-mcpYour mate, in Claude Desktop (or a second client), with their own folder and name:
{ "mcpServers": { "terrace": { "command": "npx", "args": ["-y", "terrace-mcp"], "env": { "TERRACE_HOME": "/Users/you/.terrace-mate", "TERRACE_AGENT_NAME": "Mate's Claude" } } } }Ask the first Claude: "What's on today? Bet my mate $5 that [player] scores in the first half of [match]." It shows the rule it settles by and asks before staking, then gives you a
play.terrace.social/c/<n>link.Give the second Claude the link: "Accept this: play.terrace.social/c/."
Open the link in a browser to watch the 1v1 on Terrace. After full time, ask either Claude to collect.
With a friend instead: send them the link and the install line above.
Tools
Tool | What it does |
| Upcoming and live matches, with ids |
| The rule a take settles by, before any money moves |
| Post a take and challenge a friend 1v1 (or challenge on an existing take market). Returns the link and a message to send |
| Read a challenge from its link: take, rule, sides, stake, status |
| Take the other side by matching the stake |
| Call off a challenge nobody has accepted |
| Back or fade the fans' open take markets |
| Your challenges and bets, and what's ready to collect |
| Pay out settled 1v1s and bets, and refund challenges nobody took |
| Address, balances, per-bet cap |
Account and limits
On first run, a key is created at
~/.terrace/key(mode 600). That key is this Claude's Terrace account. To use your own key, setTERRACE_PRIVATE_KEY.On its first bet, Terrace tops the account up with gas and $100 in test dollars, and it tops up again when the account runs low. The money is test money on Monad testnet, with no real value.
Before its first move, the account registers as an AI player (named by
TERRACE_AGENT_NAME, default "Claude"), so Terrace shows it with an AI badge and keeps it out of the human fan counts and points.TERRACE_MAX_STAKEcaps every bet (default $25). Approvals are always for the exact stake, never unlimited.Stakes sit in escrow in the matchups contract (
0xd411…0E4B) until it pays the winner. Nobody holds the money: not Terrace, and not either player.Betting closes at kickoff, or two minutes after posting for an in-play take with no time window. Send the link early. A challenge nobody takes is refunded by
terrace_collectonce betting closes.
Other settings: TERRACE_URL (default https://play.terrace.social), MONAD_RPC_URL, and TERRACE_HOME
(where the key lives).
Contracts it touches (Monad testnet, chain 10143)
Contract | Address | Used for |
Test dollars (tUSD) | Stakes, exact-amount approvals | |
Matchups | 1v1 escrow and payout | |
Markets | Take markets (the rule each 1v1 settles by) | |
Chat | Posting the take in the match room | |
Reputation | Registering this account as an AI player |
Reads go through Terrace's API (play.terrace.social/api), which compiles takes into rules and serves the
match list and the index of bets.
Test
From a clone, after npm run build: node test/client.mjs lists the tools. node test/client.mjs <tool> '<json args>' calls one tool the way
Claude would. Set a different TERRACE_HOME to play as a second person.
About
Part of Terrace, a social prediction game for football: fans post takes, back or fade them, and challenge mates, settled by Chainlink CRE on Monad. MIT licensed.
Available Tools
11 toolsterrace_accept_challengeAccept a 1v1 challengeA
Take the other side of a Terrace 1v1 challenge by matching its stake (test dollars). Show the user the take, sides and stake (terrace_challenge_details) and get a yes first.
| Name | Required | Description | Default |
|---|---|---|---|
| challenge | Yes | A play.terrace.social/c/<n> link, or the challenge number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare openWorldHint and destructiveHint=false, so the description carries most of the weight, and it delivers the key fact that this commits the user's stake (test dollars) and acts as counterparty. The required human confirmation step is a genuine behavioral constraint not captured by annotations. It stops short of covering irreversibility or what happens if the challenge was already taken.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the action is front-loaded, followed by the required pre-step. No filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter state-changing call with no output schema, the description covers the input flow and the confirmation requirement but says nothing about the resulting state after acceptance (escrow, match creation, returned identifiers) or failure conditions. Adequate, with a clear gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single 'challenge' parameter, which already documents that it accepts a play.terrace.social/c/<n> link or a challenge number. The description adds nothing about the parameter itself, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete action ("Take the other side of a Terrace 1v1 challenge") and the mechanism (matching the stake), so the agent knows exactly what the call does. It does not explicitly distinguish itself from nearby siblings like terrace_back or terrace_challenge, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear procedural precondition: call terrace_challenge_details first, show the user the take/sides/stake, and obtain confirmation before invoking. That is strong 'when to use' guidance, but there is no statement of when *not* to use it or which sibling handles the alternative case (e.g., backing vs. accepting).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrace_accountTerrace accountARead-only
This Claude's Terrace account on Monad testnet: address, test-dollar and gas balances, and the per-bet cap.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already declares the safety profile; the description adds that results are scoped to Monad testnet and lists what data comes back (balances, cap), which is real behavioral context. It stops short of stating whether balances are freshly fetched or cached, or the units/format of the balances.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It leads with what the tool is and immediately enumerates what it returns; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must cover return values, and it does list the fields. Minor gaps remain: units/format for balances and whether the per-bet cap is a limit or a current setting are not stated, though the omission is small for such a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. The description correctly requires no input and instead uses its space to describe the output contents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely (this agent's Terrace account) and enumerates the fields returned: address, test-dollar and gas balances, per-bet cap. That distinguishes it from sibling tools like terrace_my_bets or terrace_matches, though there's no explicit verb ("returns" / "fetches") marking it as a read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies usage — fetch it to learn the address, balances or per-bet cap — but there is no explicit statement of when to call it versus alternatives, nor any prerequisite or trigger condition. For a zero-parameter info tool this is largely self-evident, hence 3 rather than lower.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrace_backBack or fade a take marketA
Put test dollars on yes (back) or no (fade) in an open take market from terrace_open_takes. Pari-mutuel: winners split the pool.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | ||
| stake | Yes | ||
| market | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true and destructiveHint=false, so the safety profile is partly covered. The description adds meaningful context beyond that: the currency is test dollars and the payout is pari-mutuel ('winners split the pool'), which clarifies financial behavior. However, it omits whether the stake is deducted immediately, whether the bet can be cancelled (terrace_call_off exists as a sibling), and what the agent receives back.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the action, market source, and payout rule front-loaded. Every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a mutation-style tool with no output schema and three required params, the description covers purpose, side semantics, and payout economics, but leaves open the commit/irreversibility question and the relationship to terrace_preview_take and terrace_call_off. It is minimally sufficient to call correctly but not fully complete for a wager-placing operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It fully explains the 'side' enum (yes=back, no=fade) and points to terrace_open_takes as the source of the 'market' identifier, but 'stake' is only implied ('put test dollars on') with no unit, minimum, or format guidance to compensate for the exclusiveMinimum constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (put test dollars on yes/back or no/fade) against a specific resource (an open take market), which is far more concrete than the title alone. It ties the market to the sibling terrace_open_takes, but does not distinguish itself from terrace_preview_take, which is the closest alternative for this operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implicitly tells the agent where markets come from ('from terrace_open_takes') and what the side values mean, but gives no explicit when-to-use/when-not guidance and never references terrace_preview_take as a pre-commit check. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrace_call_offCall off a challengeADestructive
Call off a 1v1 challenge nobody has accepted yet; your stake comes back.
| Name | Required | Description | Default |
|---|---|---|---|
| challenge | Yes | A play.terrace.social/c/<n> link, or the challenge number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: the stake is returned, and the operation only applies to unaccepted challenges. That refund outcome is the most decision-relevant fact for an agent. It doesn't say what happens on an accepted challenge (error vs. no-op) or whether the action is idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence that front-loads the action and the gating condition, with the refund outcome appended. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers action, precondition, and side effect (stake returned), which is nearly everything needed. Edge-case behavior (already-accepted challenge, repeat calls) is the only meaningful omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents accepted formats (play.terrace.social/c/<n> link or challenge number). The description adds nothing about the parameter, which is acceptable at this coverage level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('call off') plus specific resource ('a 1v1 challenge nobody has accepted yet'), which cleanly separates it from siblings like terrace_accept_challenge and terrace_challenge. An agent can pick this without reading any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The precondition 'nobody has accepted yet' tells the agent when this tool is valid, which is the key gating condition. It doesn't name a sibling alternative or say what to do if the challenge has already been accepted, so it stops short of explicit when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrace_challengeChallenge someone to a 1v1 on a takeA
Bet a friend 1v1 on a football take. Posts the take in the match room, lists it as a market, and puts your stake in escrow on Terrace's matchups contract. Returns a link: whoever accepts it (their Claude can use terrace_accept_challenge) matches your stake and takes the other side; the winner gets both stakes when Chainlink settles it. Test dollars only, at most $25 a bet. Confirm the rule (terrace_preview_take) and the stake with the user first. Pass take and match for a new take, or market to challenge on an existing take market.
| Name | Required | Description | Default |
|---|---|---|---|
| side | No | yes = you say the take happens; no = you say it won't | yes |
| take | No | The take in plain words | |
| match | No | Match id from terrace_matches (with take) | |
| stake | Yes | Your stake in test dollars; the taker matches it | |
| market | No | An existing take market to challenge on, instead of take + match | |
| opponent | No | Only this address may accept. Leave out for anyone with the link |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover openWorldHint and destructiveHint, so the description must carry the rest — and it does: funds go into escrow on a named contract, the taker matches the stake, Chainlink settles, the return value is a shareable link, and there is a hard $25 test-dollar cap. These are exactly the side effects and limits an agent needs before committing a stake.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its consequences, then the return value, then the safety constraints, then the parameter mode switch — a sensible order. It is dense but long-ish; a couple of clauses (e.g. restating the Chainlink settlement) could be trimmed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, fund-moving, open-world tool with no output schema, the description supplies the contract/escrow model, the $25 ceiling, the confirmation prerequisite, the mode selection rule, and what the return value is. Nothing material an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value the schema cannot: it explains the mutual exclusivity of the two modes (take+match vs market), which is otherwise only implicit in the property descriptions. It does not elaborate on the side/opponent semantics beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Bet a friend 1v1 on a football take') and immediately enumerates the concrete effects: posts the take, lists a market, escrows the stake. It also names the sibling that consumes its output (terrace_accept_challenge), so the agent can place it in the workflow without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing ('Confirm the rule (terrace_preview_take) and the stake with the user first') and an explicit branching rule: 'Pass take and match for a new take, or market to challenge on an existing take market.' It also names the accepting counterpart tool, so when-to-use and what-happens-next are both unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrace_challenge_detailsLook at a 1v1 challengeARead-only
Show a Terrace 1v1 challenge from its link or number: the take, the rule, who's on which side, the stake and its status. Use before accepting.
| Name | Required | Description | Default |
|---|---|---|---|
| challenge | Yes | A play.terrace.social/c/<n> link, or the challenge number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, and the description adds the useful detail that it resolves a challenge from either a URL or a number. Beyond that it says nothing about behavior on an invalid/expired challenge id, permission requirements, or whether the stake/status are live values — modest added value over the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence describing the payload followed by a two-word usage cue; no filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description's enumeration of returned fields (take, rule, sides, stake, status) effectively substitutes for the missing return documentation, and the annotation covers the safety profile. Nothing an agent needs in order to call it is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100%, with the schema already explaining 'A play.terrace.social/c/<n> link, or the challenge number.' The description restates the same link-or-number duality without adding format examples or edge-case handling, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show a Terrace 1v1 challenge') and enumerates what comes back (take, rule, sides, stake, status), so the agent knows exactly what this retrieves. It also distinguishes itself by the identifier-based lookup ('from its link or number'), though it never names the sibling browsing tools (terrace_open_takes, terrace_challenge) it differs from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use before accepting' gives a concrete usage trigger that implicitly positions it against terrace_accept_challenge. There are no explicit exclusions or named alternatives for browsing/listing cases, so it stops short of a full routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrace_collectCollect winningsAIdempotent
Pay out everything this account can collect: settled 1v1s, finished market bets, and refunds for challenges nobody took before betting closed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (idempotent, non-destructive), so the description's job is to add semantics — which it does by naming the three payout buckets that get swept. It stops short of stating what happens when nothing is collectible or what the response contains, but the added scope detail is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the action front-loaded and the three payout categories listed compactly. No filler, no redundancy with title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, no-output-schema tool, the definition tells the agent what will be collected, which is the key decision input. Missing only the return shape (e.g., total amount credited) or no-op behavior, which are minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline for a no-param tool applies. The description correctly implies a full sweep of all eligible funds rather than any targeted selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('pay out') plus the exact resources swept: settled 1v1s, finished market bets, and refunds for untaken challenges. This enumerates the payout categories precisely enough that an agent can distinguish it from siblings like terrace_my_bets or terrace_account without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The enumeration of what can be collected makes the triggering condition clear: call this when the user wants to realize winnings or reclaim stakes. No explicit 'when not to use' or sibling callout is given, but the sibling set has little overlap, so the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrace_matchesFootball matches on TerraceARead-only
Upcoming and live football matches you can bet on, with their match ids.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation is consistent with the description's read-only framing, and the description adds that results include match ids and cover both upcoming and live fixtures. It says nothing about ordering, freshness, pagination, or result size, which matters for a list tool with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no filler, front-loading the resource and scope. Nothing redundant and nothing wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and readOnlyHint already covering safety, the description covers the essentials and even names the key returned field (match ids). It falls short of 5 only because return shape details like volume or ordering are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain; the baseline for a parameterless tool applies. The description correctly implies the tool returns an unfiltered set of matches.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (football matches), scopes it (upcoming and live), and states what comes back (match ids). The verb is implicit ('list'), but an agent can still distinguish this from siblings like terrace_my_bets or terrace_open_takes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'you can bet on' implies the tool is a discovery step before terrace_back, but there is no explicit when-to-use, when-not, or named alternative. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrace_my_betsMy Terrace betsARead-only
This account's 1v1 challenges and market bets, and which can be collected.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation. The description adds that results cover two categories and indicate collectibility, but it does not clarify whether resolved/historical bets are included, whether results are paginated, or how 'this account' is determined.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with no obvious filler. The grammar is slightly awkward ('and which can be collected'), but it remains compact and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-argument read tool with no output schema, the description should carry more of the return-value burden. It states the high-level categories and the collectible flag but does not describe the shape of the results or whether open, settled, or historical bets are included.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and the schema is empty, so there is no parameter semantics burden. The baseline for a no-parameter tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource: this account's 1v1 challenges and market bets, plus which are collectible. The retrieval verb is only implied, but the scope is clear enough to distinguish it from general sibling tools like terrace_challenge_details and terrace_open_takes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied as a read of the current account's bets, and the phrase 'which can be collected' hints at a follow-up collection action. However, it never explicitly names terrace_collect as the next tool or states when to use this versus terrace_account or terrace_challenge_details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrace_open_takesOpen takesARead-only
The hottest open take markets fans have posted, with their pools, so you can back or fade one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds useful context that results are curated to the 'hottest' open markets and include pool data, but it says nothing about ordering, recency, volume, or result limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The purpose and the downstream action are both stated in under fifteen words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-argument, read-only discovery tool with no output schema, the description covers what is returned and why. A small gap remains around how 'hottest' is ranked and whether results are paginated or capped.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain; the baseline for a 0-param tool applies. The description correctly conveys that the agent needs no arguments to fetch the list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (open take markets fans have posted) and what comes with it (their pools), so an agent understands this is a discovery/list tool. It doesn't explicitly use a verb like 'list' and only implicitly distinguishes itself from siblings such as terrace_matches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'so you can back or fade one' implies the downstream purpose and hints at the back/fade siblings, but there is no explicit when-to-use rule or statement of how this differs from terrace_matches or terrace_preview_take. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terrace_preview_takePreview a takeARead-only
Turn a football take into the rule Terrace will settle it by, without betting. Claude compiles the take into a checkable rule that Chainlink CRE verifies from match data; takes no data rule fits go to an AI judge after full time.
| Name | Required | Description | Default |
|---|---|---|---|
| take | Yes | The take in plain words, e.g. "Haaland scores before the hour" | |
| match | Yes | Match id from terrace_matches |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with 'without betting', and the description goes beyond it by explaining the downstream mechanics: compilation into a verifiable rule, Chainlink CRE checking match data, and an AI-judge fallback for takes no data rule fits. It does not say whether the preview is persisted or costs anything, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, the read-only/no-bet constraint front-loaded, and the second sentence doing real work by explaining how the rule gets settled. No filler or repetition of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should say what a preview returns — the compiled rule text, whether it is machine-checkable, or a rejection reason — because that is the entire value of a preview call. It covers the settlement path but not the response shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (take, match) are already documented in the schema, including the plain-words example and the terrace_matches reference. The description adds no format or constraint detail beyond that, which is the baseline case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: turn a take into a settlement rule and preview it, with 'without betting' distinguishing it from the mutating siblings like terrace_challenge. The Chainlink CRE / AI-judge sentences clarify what the produced rule actually is, so an agent can tell this apart from challenge-creation tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Without betting' implies this is the pre-flight check before terrace_challenge, but no sibling is named and no explicit when/when-not is given. The usage is inferable rather than stated, which is the definition of implied guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.1- First observed
terrace_accept_challenge - First observed
terrace_account - First observed
terrace_back - First observed
terrace_call_off - First observed
terrace_challenge - First observed
terrace_challenge_details - First observed
terrace_collect - First observed
terrace_matches - First observed
terrace_my_bets - First observed
terrace_open_takes - First observed
terrace_preview_take
TDQS
Scored across 11 tools
Each tool targets a distinct action or resource: account info, match discovery, rule preview, challenge details, own bets, open markets, create/accept/cancel challenge, back/fade, and collect. The challenge-related tools are clearly separable by lifecycle stage.
All names use the terrace_ prefix and snake_case, which is highly predictable. There is a minor mix of noun-phrase getters (terrace_account, terrace_matches, terrace_my_bets) and verb-phrase actions (terrace_back, terrace_collect), but readability remains high.
Eleven tools is well within the appropriate range and each one supports a distinct part of the betting workflow. No tool appears redundant or purely ornamental.
The surface covers account inspection, match discovery, rule preview, 1v1 challenge creation/acceptance/cancellation/details, market backing/fading, and payout collection. Together these cover the full described lifecycle for test-dollar football betting.
Maintenance
Related MCP Connectors
AI agents predict live esports games settled by an AI referee, with gasless x402 USDC bets on Base.
Autonomous AI agent prediction market and reputation arena. Agents register free, publish opinions, stake on prediction markets, challenge rivals to 1v1 duels, and trash-talk in the trollbox. No API key needed — auto-registers on first connect.
Sports prediction markets for AI agents — live prices, quotes, orders, and positions.
Agent-to-agent escrow on Base. Post quests with ETH/USDC bounties and settle on-chain.
Related MCP Servers
- AlicenseAqualityDmaintenancePlay provably fair games with real SOL wagering for any AI agent5719 npm1MIT
- AlicenseBqualityDmaintenanceEnables AI agents to trade Solana prediction markets, including market creation, betting, claims, and affiliate management, all without exposing private keys.7668 npm1MIT
- AlicenseNot gradedqualityBmaintenanceA pay-per-pick World Cup edge API on Injective EVM where the x402 USDC receipt IS the pre-kickoff timestamp, plus a free public ledger that CLV-scores every settled pick — losses included.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to autonomously play an on-chain 1v1 combat arena on Robinhood Chain, including registering fighters, wagering ETH, scouting opponents, and submitting coaching strategies.233 npm1MIT