<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Manish Kumbham</title>
    <description>The latest articles on DEV Community by Manish Kumbham (@cachecarti).</description>
    <link>https://dev.to/cachecarti</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4096323%2Fa45d87eb-0596-4af4-94ba-a7ccfb08173f.png</url>
      <title>DEV Community: Manish Kumbham</title>
      <link>https://dev.to/cachecarti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cachecarti"/>
    <language>en</language>
    <item>
      <title>I built an MCP server for crypto trading strategies, design decisions and what I learned</title>
      <dc:creator>Manish Kumbham</dc:creator>
      <pubDate>Wed, 26 Aug 2026 21:21:17 +0000</pubDate>
      <link>https://dev.to/cachecarti/i-built-an-mcp-server-for-crypto-trading-strategies-design-decisions-and-what-i-learned-3824</link>
      <guid>https://dev.to/cachecarti/i-built-an-mcp-server-for-crypto-trading-strategies-design-decisions-and-what-i-learned-3824</guid>
      <description>&lt;p&gt;I've been building a crypto trading platform (dMoERA) that runs algorithmic bots on ETH/BTC/SOL pairs. The core problem I kept hitting: the strategy development loop is brutal. You write a bot, manually backtest it, eyeball the results, try 20 variations, repeat. So I wrapped the whole thing in an MCP server and open-sourced the client.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdtrmhsu4u0oqig1h8bvy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdtrmhsu4u0oqig1h8bvy.gif" alt="dMoERA MCP Demo" width="400" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyvv1741mj3lpolzfa8z5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyvv1741mj3lpolzfa8z5.png" alt="dMoERA Creator Studio" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href="https://github.com/CacheCarti/dmoera-mcp" rel="noopener noreferrer"&gt;github.com/CacheCarti/dmoera-mcp&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Smithery&lt;/strong&gt;: &lt;a href="https://smithery.ai/servers/mk9654/dMoERA-Creator" rel="noopener noreferrer"&gt;smithery.ai/servers/mk9654/dMoERA-Creator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's not a trading bot. It's not a signal service. It's an MCP interface that lets any MCP-compatible agent (Claude, Cursor, Windsurf, Devin) interact with a running trading platform, discover markets, backtest strategies, submit them for validation, and monitor live performance.&lt;/p&gt;

&lt;p&gt;This post is about the design decisions that mattered.&lt;/p&gt;


&lt;h2&gt;
  
  
  How the strategy contract works
&lt;/h2&gt;

&lt;p&gt;Strategies subclass a &lt;code&gt;Strategy&lt;/code&gt; class and implement &lt;code&gt;on_bar(self, ctx) -&amp;gt; Signal&lt;/code&gt;. The signal is just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;direction&lt;/strong&gt; (long/short/flat)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;confidence&lt;/strong&gt; (0-1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;stop_loss_bps&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;take_profit_bps&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;horizon_seconds&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. The bot never sees leverage, position sizing, or portfolio state, the router handles all of that.&lt;/p&gt;

&lt;p&gt;This was a deliberate decision: &lt;strong&gt;bots that know their leverage tend to overfit to it&lt;/strong&gt;. If a bot knows it has 10x, it'll optimize for 10x-specific risk profiles that stop working the moment leverage changes. By isolating the signal from the execution, the same bot can run at 1x for a conservative user and 10x for an aggressive one without changing a single line.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;ctx&lt;/code&gt; object gives access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OHLCV bars (configurable lookback)&lt;/li&gt;
&lt;li&gt;A feature catalog: funding rates, Fear &amp;amp; Greed index, order book imbalance, ATR, RSI, volume profile&lt;/li&gt;
&lt;li&gt;Current market regime (trending / ranging / crisis) with a crisis score&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All features are pre-computed and cached. The strategy just reads them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Strategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;METADATA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SMA Crossover&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;domain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eth_usdc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;declared_sl_bps&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;150.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;declared_tp_bps&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;300.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;declared_hold_seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;warmup_bars&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required_features&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;closes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;closes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lookback&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="n"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
        &lt;span class="n"&gt;slow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;slow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SignalDirection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LONG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;confidence&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;stop_loss_bps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;150.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;take_profit_bps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;300.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;horizon_seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Validation
&lt;/h2&gt;

&lt;p&gt;Submitted strategies go through a 7-stage validation pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Static check&lt;/strong&gt; — metadata validation, SL/TP ceiling, code safety scan&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-sample backtest&lt;/strong&gt; — seeded RNG, no wall clock, no network&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Out-of-sample&lt;/strong&gt; — 40% of data held out, never seen during in-sample&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walk-forward&lt;/strong&gt; — 4 rolling windows, train on each, test on the next&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Randomized start&lt;/strong&gt; — 10 backtests with different start dates, checks for start-date luck&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perturbation&lt;/strong&gt; — inject small noise into OHLCV, checks for overfitting to exact prices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holdout&lt;/strong&gt; — final test on data the strategy has never seen&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A strategy has to pass all 7 to go live. The holdout stage is the gate, if it fails there, it doesn't deploy regardless of how good earlier stages looked.&lt;/p&gt;

&lt;p&gt;After passing two stages, you can choose to make the code open-source so others can fork and improve it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tournament system
&lt;/h2&gt;

&lt;p&gt;Bots compete in 3-day rounds across 6 domains (ETH/BTC/SOL spot + scalp). Scoring is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;50%&lt;/strong&gt; rolling Sharpe ratio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30%&lt;/strong&gt; rolling return (last 25 trades, compounded)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;20%&lt;/strong&gt; consistency (win rate × trade volume)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Top 3 per domain win USDT from the reward pool. No user following needed, your bot competes on its own metrics.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this does NOT do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No execution layer in the MCP server.&lt;/strong&gt; The server is a thin API client. It talks to a running dMoERA backend over HTTP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No published performance numbers.&lt;/strong&gt; The bots on the platform have live track records you can inspect, but I'm not going to cherry-pick numbers for this post. Call &lt;code&gt;get_bot_profile&lt;/code&gt; and see for yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No code execution in the MCP server itself.&lt;/strong&gt; Backtesting runs on the backend in a sandboxed process. The server just passes strategy code via HTTP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a framework for building your own backtester.&lt;/strong&gt; This is specifically for the dMoERA platform's strategy contract.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tools (16)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list_domains&lt;/code&gt;, &lt;code&gt;list_bots&lt;/code&gt;, &lt;code&gt;get_bot_profile&lt;/code&gt;, &lt;code&gt;get_feature_catalog&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Market data&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;get_market_regime&lt;/code&gt;, &lt;code&gt;get_current_prices&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strategy dev&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sandbox_backtest&lt;/code&gt;, &lt;code&gt;submit_strategy&lt;/code&gt;, &lt;code&gt;list_strategies&lt;/code&gt;, &lt;code&gt;get_strategy_report&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketplace&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;get_marketplace_bots&lt;/code&gt;, &lt;code&gt;get_tournament_status&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;open_source_strategy&lt;/code&gt;, &lt;code&gt;fork_strategy&lt;/code&gt;, &lt;code&gt;get_open_source_leaderboard&lt;/code&gt;, &lt;code&gt;delist_strategy&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Resources (2)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;creator-api://docs&lt;/code&gt; — Full strategy contract documentation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;creator-api://strategy-template&lt;/code&gt; — Copy-pasteable template&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Auth model
&lt;/h2&gt;

&lt;p&gt;Public tools (market data, leaderboard, tournament) work with no key. Authenticated tools (backtest, submit, fork) need a personal access token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transports
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;stdio&lt;/strong&gt;: &lt;code&gt;python mcp_creator_server.py&lt;/code&gt; (for Claude Desktop, Cursor, Windsurf)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streamable HTTP&lt;/strong&gt;: &lt;code&gt;https://dmoera.xyz/mcp&lt;/code&gt; (for Smithery, remote clients)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dmoera-creator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/absolute/path/to/dmoera-mcp/mcp_creator_server.py"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"DMOERA_API_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://dmoera.xyz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"DMOERA_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_optional_personal_access_token"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API key is optional for public tools. Create a personal access token at &lt;a href="https://dmoera.xyz" rel="noopener noreferrer"&gt;dmoera.xyz&lt;/a&gt; under &lt;strong&gt;Settings → API Keys&lt;/strong&gt; to backtest, submit, fork, open-source, or delist strategies.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/CacheCarti/dmoera-mcp" rel="noopener noreferrer"&gt;github.com/CacheCarti/dmoera-mcp&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Smithery&lt;/strong&gt;: &lt;a href="https://smithery.ai/servers/mk9654/dMoERA-Creator" rel="noopener noreferrer"&gt;smithery.ai/servers/mk9654/dMoERA-Creator&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Platform&lt;/strong&gt;: &lt;a href="https://dmoera.xyz" rel="noopener noreferrer"&gt;dmoera.xyz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT license. Happy to answer questions or take criticism. If you see design flaws in the strategy contract or validation approach or any nice-to-haves :) I genuinely want to know.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cryptocurrency</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
