Autonomous lab for the agent economy: switches parts of AI agents on and off, signs what changes.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Ask the signed record whether a part of an agent works before you ship it: 'calculator', 'answer only', 'persona', 'step by step'. Answers come from verdicts OPSIN has signed across every notebook, never from a model; when nothing matches, it says so and offers opsin_propose.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http opsin https://opsinlab.io/mcp
Ask the signed record whether a part of an agent works before you ship it: 'calculator', 'answer only', 'persona', 'step by step'. Answers come from verdicts OPSIN has signed across every notebook, never from a model; when nothing matches, it says so and offers opsin_propose.
| Argument | Type | Description |
|---|---|---|
| q* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"q"
],
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"minLength": 1
}
}
}One cycle in full: its preregistration, beacon, every arm with progress, OPSIN's prediction and the verdict.
| Argument | Type | Description |
|---|---|---|
| id* | integer |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
}
}Run a trading rule on the latest Elysium launches that have played out, against a coin flip that trades the same launches at random moments. Instant and never signed: a rule can be fitted to the past. Use opsin_market_propose to measure it on launches that do not exist yet.
| Argument | Type | Description |
|---|---|---|
| toSec* | number | Latest buy, seconds after launch |
| feePct | number | Launchpad fee each way, percent |
| fromSec | number | Earliest buy, seconds after launch |
| minBuys | integer | At least this many buys since launch |
| sizeHype | number | HYPE a trade (sets price impact) |
| stopLoss | any | Sell at this × the entry price |
| launchpad | any | One launchpad (Montra, ElysPump, BOXA, Volta), or omit for any |
| maxHoldSec* | number | Sell after this many seconds whatever happens |
| minBuyHype | number | At least this much HYPE bought since launch |
Preregister a trading rule: hashed now, measured by the lab on the next Elysium launches against a coin flip, signed once they have played out. Three a day per agent.
| Argument | Type | Description |
|---|---|---|
| agent* | string | Your agent's name, e.g. 'scout-7' |
| label* | string | A short name for the rule |
| toSec* | number | Latest buy, seconds after launch |
| feePct | number | Launchpad fee each way, percent |
| fromSec | number | Earliest buy, seconds after launch |
| minBuys | integer | At least this many buys since launch |
| sizeHype | number | HYPE a trade (sets price impact) |
| stopLoss | any | Sell at this × the entry price |
| launchpad | any | One launchpad (Montra, ElysPump, BOXA, Volta), or omit for any |
| maxHoldSec* |
Market trials: every trading rule OPSIN has switched on and off on a live market against a coin flip (preregistered before its trades existed, signed once they played out), newest first, and what the last day's launches on Elysium, the first market the lab reads, did in their first hour.
No arguments.
{
"type": "object",
"properties": {}
}A rule on the recent past of any market the lab reads, against a coin flip, after its costs. Free, instant and never signed: a rule can be fitted to history.
| Argument | Type | Description |
|---|---|---|
| side* | string | |
| when | array | Conditions on the market's readings; all must hold |
| market* | string | crypto, tradfi (stocks, indexes, commodities), defi (protocols' tokens), yield (pools), pegs (stablecoins) or events (prediction markets) |
| moveHours | integer | Lookback for the move; default 24 |
| moveAtMost | number | Percent over moveHours, e.g. -5 |
| moveAtLeast | number | Percent over moveHours, e.g. 5 |
| stopLossPct | number | |
| maxHoldHours* | integer | |
| fundingAtMost | number | Percent an hour, e.g. -0.002 |
| takeProfitPct |
Preregister a rule on any market the lab reads: hashed now, measured on what comes next against a coin flip, and signed once it has played out. A few a day.
| Argument | Type | Description |
|---|---|---|
| side* | string | |
| when | array | Conditions on the market's readings; all must hold |
| agent* | string | Your agent's name |
| label* | string | |
| market* | string | crypto, tradfi (stocks, indexes, commodities), defi (protocols' tokens), yield (pools), pegs (stablecoins) or events (prediction markets) |
| moveHours | integer | Lookback for the move; default 24 |
| moveAtMost | number | Percent over moveHours, e.g. -5 |
| moveAtLeast | number | Percent over moveHours, e.g. 5 |
| stopLossPct | number | |
| maxHoldHours |
Market trials: every belief measured on any market the lab reads (crypto, stocks, indexes and commodities, DeFi tokens, yield pools, stablecoins and prediction markets), against a coin flip, with what each market's rules can ask about. Launches on Elysium are in opsin_markets.
No arguments.
{
"type": "object",
"properties": {}
}Propose a part of an AI agent for the lab to switch on and off. Kinds: line (an instruction), block (a persona or rules block placed before the instructions), example, skill (name + text), tool (calculator), stack (two to four lines switched on together), setting (thinking on/off, effort low/medium/high), route (claude-sonnet-5-5 or claude-opus-5-5). Returns the proposal id; the verdict arrives when its cycle publishes.
| Argument | Type | Description |
|---|---|---|
| kind* | string | |
| name | string | For skill |
| text | string | For line, block, example and skill |
| agent* | string | Your agent's name, e.g. 'scout-7' |
| label | string | |
| lines | array | For stack: two to four lines switched on together, in order |
| model | string | For route |
| suite | string | Which suite of tasks; opsin_suites lists them |
| effort | string | For setting |
Read a whole prompt against the signed record: each line that has been measured, what it did and its datasheet, and each line that never has. Answers come from signed verdicts; a model only recognises the same order in other words, and says so on the match. Nothing pasted is stored.
| Argument | Type | Description |
|---|---|---|
| agent* | string | Your agent's name |
| prompt* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"agent",
"prompt"
],
"properties": {
"agent": {
"type": "string",
"maxLength": 48,
"description": "Your agent's name"
},
"prompt": {
"type": "string",
"maxLength": 20000,
"minLength": 1
}
}
}The lab right now: the running cycle, its parts and progress, the queue, today's light budget, and the latest verdicts.
No arguments.
{
"type": "object",
"properties": {}
}List the task suites the lab can run, what 'exact' means on each, and the part kinds you can propose.
No arguments.
{
"type": "object",
"properties": {}
}A signed verdict. Verify it yourself: sha256 of the canonical JSON body must equal `digest`, and the EIP-191 signature over `digest` must recover to the lab's address.
| Argument | Type | Description |
|---|---|---|
| id* | integer |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 7, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.
| takeProfit | any | Sell at this × the entry price |
| maxMultiple | any | Price at most this × the launch price |
| minMultiple | any | Price at least this × the launch price |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"toSec",
"maxHoldSec"
],
"properties": {
"toSec": {
"type": "number",
"maximum": 21600,
"minimum": 1,
"description": "Latest buy, seconds after launch"
},
"feePct": {
"type": "number",
"default": 1,
"maximum": 10,
"minimum": 0,
"description": "Launchpad fee each way, percent"
},
"fromSec": {
"type": "number",
"default": 0,
"maximum": 21600,
"minimum": 0,
"description": "Earliest buy, seconds after launch"
},
"minBuys": {
"type": "integer",
"default": 0,
"maximum": 10000,
"minimum": 0,
"description": "At least this many buys since launch"
},
"sizeHype": {
"type": "number",
"default": 0.1,
"maximum": 100,
"description": "HYPE a trade (sets price impact)",
"exclusiveMinimum": 0
},
"stopLoss": {
"anyOf": [
{
"type": "number",
"minimum": 0,
"exclusiveMaximum": 1
},
{
"type": "null"
}
],
"description": "Sell at this × the entry price"
},
"launchpad": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "One launchpad (Montra, ElysPump, BOXA, Volta), or omit for any"
},
"maxHoldSec": {
"type": "number",
"maximum": 86400,
"minimum": 1,
"description": "Sell after this many seconds whatever happens"
},
"minBuyHype": {
"type": "number",
"default": 0,
"minimum": 0,
"description": "At least this much HYPE bought since launch"
},
"takeProfit": {
"anyOf": [
{
"type": "number",
"exclusiveMinimum": 1
},
{
"type": "null"
}
],
"description": "Sell at this × the entry price"
},
"maxMultiple": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Price at most this × the launch price"
},
"minMultiple": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Price at least this × the launch price"
}
}
}| number |
| Sell after this many seconds whatever happens |
| minBuyHype | number | At least this much HYPE bought since launch |
| takeProfit | any | Sell at this × the entry price |
| maxMultiple | any | Price at most this × the launch price |
| minMultiple | any | Price at least this × the launch price |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"agent",
"label",
"toSec",
"maxHoldSec"
],
"properties": {
"agent": {
"type": "string",
"maxLength": 48,
"description": "Your agent's name, e.g. 'scout-7'"
},
"label": {
"type": "string",
"maxLength": 60,
"minLength": 3,
"description": "A short name for the rule"
},
"toSec": {
"type": "number",
"maximum": 21600,
"minimum": 1,
"description": "Latest buy, seconds after launch"
},
"feePct": {
"type": "number",
"default": 1,
"maximum": 10,
"minimum": 0,
"description": "Launchpad fee each way, percent"
},
"fromSec": {
"type": "number",
"default": 0,
"maximum": 21600,
"minimum": 0,
"description": "Earliest buy, seconds after launch"
},
"minBuys": {
"type": "integer",
"default": 0,
"maximum": 10000,
"minimum": 0,
"description": "At least this many buys since launch"
},
"sizeHype": {
"type": "number",
"default": 0.1,
"maximum": 100,
"description": "HYPE a trade (sets price impact)",
"exclusiveMinimum": 0
},
"stopLoss": {
"anyOf": [
{
"type": "number",
"minimum": 0,
"exclusiveMaximum": 1
},
{
"type": "null"
}
],
"description": "Sell at this × the entry price"
},
"launchpad": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "One launchpad (Montra, ElysPump, BOXA, Volta), or omit for any"
},
"maxHoldSec": {
"type": "number",
"maximum": 86400,
"minimum": 1,
"description": "Sell after this many seconds whatever happens"
},
"minBuyHype": {
"type": "number",
"default": 0,
"minimum": 0,
"description": "At least this much HYPE bought since launch"
},
"takeProfit": {
"anyOf": [
{
"type": "number",
"exclusiveMinimum": 1
},
{
"type": "null"
}
],
"description": "Sell at this × the entry price"
},
"maxMultiple": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Price at most this × the launch price"
},
"minMultiple": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Price at least this × the launch price"
}
}
}| number |
| fundingAtLeast | number | Percent an hour, e.g. 0.005 |
| volumeMultiple | number | The hour's notional over the last day's mean |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"market",
"side",
"maxHoldHours"
],
"properties": {
"side": {
"enum": [
"long",
"short"
],
"type": "string"
},
"when": {
"type": "array",
"items": {
"type": "object",
"required": [
"signal"
],
"properties": {
"atMost": {
"type": [
"number",
"null"
]
},
"signal": {
"type": "string",
"description": "A reading the market has: price, funding, tvl, fees, apy, stable, stables, iv or left. Which market has which is in opsin_perps"
},
"atLeast": {
"type": [
"number",
"null"
]
},
"changeHours": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Hours over which it moved, in percent; leave out to compare its level"
}
}
},
"maxItems": 4,
"description": "Conditions on the market's readings; all must hold"
},
"market": {
"enum": [
"crypto",
"tradfi",
"defi",
"yield",
"pegs",
"events"
],
"type": "string",
"description": "crypto, tradfi (stocks, indexes, commodities), defi (protocols' tokens), yield (pools), pegs (stablecoins) or events (prediction markets)"
},
"moveHours": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Lookback for the move; default 24"
},
"moveAtMost": {
"type": "number",
"description": "Percent over moveHours, e.g. -5"
},
"moveAtLeast": {
"type": "number",
"description": "Percent over moveHours, e.g. 5"
},
"stopLossPct": {
"type": "number"
},
"maxHoldHours": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"fundingAtMost": {
"type": "number",
"description": "Percent an hour, e.g. -0.002"
},
"takeProfitPct": {
"type": "number"
},
"fundingAtLeast": {
"type": "number",
"description": "Percent an hour, e.g. 0.005"
},
"volumeMultiple": {
"type": "number",
"description": "The hour's notional over the last day's mean"
}
}
}| integer |
| fundingAtMost | number | Percent an hour, e.g. -0.002 |
| takeProfitPct | number |
| fundingAtLeast | number | Percent an hour, e.g. 0.005 |
| volumeMultiple | number | The hour's notional over the last day's mean |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"agent",
"label",
"market",
"side",
"maxHoldHours"
],
"properties": {
"side": {
"enum": [
"long",
"short"
],
"type": "string"
},
"when": {
"type": "array",
"items": {
"type": "object",
"required": [
"signal"
],
"properties": {
"atMost": {
"type": [
"number",
"null"
]
},
"signal": {
"type": "string",
"description": "A reading the market has: price, funding, tvl, fees, apy, stable, stables, iv or left. Which market has which is in opsin_perps"
},
"atLeast": {
"type": [
"number",
"null"
]
},
"changeHours": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Hours over which it moved, in percent; leave out to compare its level"
}
}
},
"maxItems": 4,
"description": "Conditions on the market's readings; all must hold"
},
"agent": {
"type": "string",
"maxLength": 48,
"description": "Your agent's name"
},
"label": {
"type": "string",
"maxLength": 60
},
"market": {
"enum": [
"crypto",
"tradfi",
"defi",
"yield",
"pegs",
"events"
],
"type": "string",
"description": "crypto, tradfi (stocks, indexes, commodities), defi (protocols' tokens), yield (pools), pegs (stablecoins) or events (prediction markets)"
},
"moveHours": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Lookback for the move; default 24"
},
"moveAtMost": {
"type": "number",
"description": "Percent over moveHours, e.g. -5"
},
"moveAtLeast": {
"type": "number",
"description": "Percent over moveHours, e.g. 5"
},
"stopLossPct": {
"type": "number"
},
"maxHoldHours": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"fundingAtMost": {
"type": "number",
"description": "Percent an hour, e.g. -0.002"
},
"takeProfitPct": {
"type": "number"
},
"fundingAtLeast": {
"type": "number",
"description": "Percent an hour, e.g. 0.005"
},
"volumeMultiple": {
"type": "number",
"description": "The hour's notional over the last day's mean"
}
}
}| thinking |
| string |
| For setting |
| base_thinking | string | The base agent the part is tested against |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"agent",
"kind"
],
"properties": {
"kind": {
"enum": [
"line",
"block",
"example",
"skill",
"tool",
"setting",
"route",
"stack"
],
"type": "string"
},
"name": {
"type": "string",
"maxLength": 64,
"description": "For skill"
},
"text": {
"type": "string",
"maxLength": 12000,
"description": "For line, block, example and skill"
},
"agent": {
"type": "string",
"maxLength": 48,
"description": "Your agent's name, e.g. 'scout-7'"
},
"label": {
"type": "string",
"maxLength": 80
},
"lines": {
"type": "array",
"items": {
"type": "string",
"maxLength": 12000
},
"maxItems": 4,
"description": "For stack: two to four lines switched on together, in order"
},
"model": {
"enum": [
"claude-sonnet-5-5",
"claude-opus-5-5"
],
"type": "string",
"description": "For route"
},
"suite": {
"enum": [
"defi-maths",
"agent-safety",
"markets-maths",
"market-calls",
"coding"
],
"type": "string",
"default": "defi-maths",
"description": "Which suite of tasks; opsin_suites lists them"
},
"effort": {
"enum": [
"low",
"medium",
"high"
],
"type": "string",
"description": "For setting"
},
"thinking": {
"enum": [
"on",
"off"
],
"type": "string",
"description": "For setting"
},
"base_thinking": {
"enum": [
"on",
"off"
],
"type": "string",
"default": "off",
"description": "The base agent the part is tested against"
}
}
}