{
  "schema_version": "2025-03-26",
  "name": "earlyframe-mcp-server",
  "title": "EarlyFra.me — Stateful Edge Webhook Orchestration & MCP Server",
  "version": "6.2.0",
  "description": "Model Context Protocol (MCP) server for EarlyFra.me. Allows AI agents (Claude Desktop, Cursor, Windsurf, OpenAI Agents) to inspect live webhook telemetry and edge signal memory, create or update 1-to-4 fan-out routes, arm multi-signal confluence traps, replay historical signals, rotate whk_ tokens, and run zero-quota dry-run simulations.",
  "website": "https://earlyfra.me",
  "homepage": "https://earlyfra.me/docs/mcp",
  "docs": "https://earlyfra.me/docs/mcp",
  "icon": "https://earlyfra.me/favicon.png",
  "logo": "https://earlyfra.me/logo.png",
  "source": "closed-source",
  "license": "Proprietary",
  "contact": {
    "email": "curator@earlyfra.me"
  },
  "categories": [
    "developer-tools",
    "webhooks",
    "automation",
    "infrastructure",
    "payments"
  ],
  "keywords": [
    "webhook",
    "webhook fanout",
    "tradingview",
    "discord",
    "slack",
    "telegram",
    "mcp",
    "model context protocol",
    "automation",
    "edge",
    "orchestration",
    "ai agents",
    "crypto payments"
  ],
  "endpoint": "https://relay.earlyfra.me/mcp",
  "transport": "http-json-rpc",
  "tool_count": 15,
  "resources": true,
  "capabilities": {
    "tools": true,
    "resources": true,
    "agent_payments": true,
    "instructions": true,
    "stateful_orchestration": true
  },
  "authentication": {
    "type": "header",
    "header": "X-EarlyFrame-Key",
    "bearer_supported": true,
    "required_tier": "neural (or sandbox trial for read/simulate preview)"
  },
  "pricing": {
    "model": "freemium",
    "trial": {
      "price": 0,
      "requests": 50,
      "label": "Sandbox Passkey — read + simulate"
    },
    "plans": "https://earlyfra.me/api/v1/agents/plans",
    "machine_payable": true
  },
  "data_plane": {
    "stateful_confluence": "POST /api/v1/confluence (MCP: arm_confluence_trap)",
    "signal_memory": "GET /api/v1/signals (MCP: query_signal_memory)",
    "replay": "POST /api/v1/replay (MCP: replay_historical_signal)",
    "approvals": "GET /api/v1/approvals",
    "approval_link_pattern": "https://relay.earlyfra.me/v1/approve/:approvalId?action=approve|reject&sig=..."
  },
  "payment": {
    "type": "crypto_invoice",
    "settlement_provider": "NOWPayments",
    "plans": "https://relay.earlyfra.me/api/v1/agents/plans",
    "checkout": "POST https://relay.earlyfra.me/api/v1/agents/subscribe",
    "claim": "POST https://relay.earlyfra.me/api/v1/agents/claim",
    "mcp_tools": [
      "list_plans",
      "subscribe_plan",
      "claim_subscription",
      "purchase_quota_boost"
    ]
  },
  "registry": "https://registry.modelcontextprotocol.io/v0.1/servers/me.earlyfra%2Fearlyframe-mcp/versions/6.2.0",
  "skills": {
    "index": "https://earlyfra.me/skills/index.json",
    "spec": "https://agentskills.io",
    "install": "npx skills add https://earlyfra.me",
    "install_commands": {
      "skills": "npx skills add https://earlyfra.me",
      "skills_all_agents": "npx skills add https://earlyfra.me --all",
      "skills_list": "npx skills add https://earlyfra.me --list",
      "skills_index": "https://earlyfra.me/.well-known/agent-skills/index.json",
      "skills_index_legacy": "https://earlyfra.me/.well-known/skills/index.json",
      "mcp_claude_code": "claude mcp add --transport http earlyframe https://relay.earlyfra.me/mcp --header \"X-EarlyFrame-Key: ef_live_YOUR_PASSKEY\""
    },
    "well_known": "https://earlyfra.me/.well-known/agent-skills/index.json",
    "install_paths": [
      ".agents/skills/",
      ".claude/skills/",
      ".github/skills/"
    ]
  },
  "related": {
    "catalog": "https://earlyfra.me/.well-known/ai-catalog.json",
    "server_card": "https://earlyfra.me/.well-known/server-card",
    "openapi": "https://earlyfra.me/.well-known/openapi.json",
    "agents": "https://earlyfra.me/agents",
    "agent_guide": "https://earlyfra.me/ai.txt",
    "llms": "https://earlyfra.me/llms.txt",
    "registry": "https://registry.modelcontextprotocol.io/v0.1/servers/me.earlyfra%2Fearlyframe-mcp/versions/6.2.0",
    "skills": "https://earlyfra.me/.well-known/agent-skills/index.json"
  },
  "tools": [
    {
      "name": "list_routes",
      "title": "List webhook routes",
      "description": "List all deployed 1-to-4 webhook routes, isolated whk_ ingest URLs, filter rules, and quota metrics for the authenticated EarlyFra.me Master Passkey.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "inspect_live_telemetry",
      "title": "Inspect live telemetry",
      "description": "Fetch the latest 25 webhook execution logs (delivered and dropped signals, latency in ms, and rescued JSON fields) from Edge Isolate RAM.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "route_id": {
            "type": "string",
            "description": "Optional route_id filter (e.g. rt_1)"
          },
          "limit": {
            "type": "number",
            "description": "Max log items to return (1-25)"
          }
        }
      }
    },
    {
      "name": "simulate_webhook_frame",
      "title": "Dry-run a webhook payload",
      "description": "Run a zero-quota dry-run simulation of a raw plain-text or JSON webhook payload against a route's filter rules, templates, and Edge AI synthesis.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "raw_payload": {
            "type": "string",
            "description": "Raw plain-text or JSON webhook payload to test"
          },
          "route_id": {
            "type": "string",
            "description": "Optional route_id to test against"
          }
        },
        "required": [
          "raw_payload"
        ]
      }
    },
    {
      "name": "create_or_update_route",
      "title": "Create or update a fan-out route",
      "description": "Programmatically deploy or update a 1-to-4 fan-out route on the global edge (requires Neural Frame tier for write operations via MCP).",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Route ID (e.g. rt_1) or 'new' to create a new route"
          },
          "name": {
            "type": "string",
            "description": "Human-readable route label"
          },
          "discord_webhook_url": {
            "type": "string"
          },
          "slack_webhook_url": {
            "type": "string"
          },
          "telegram_bot_url": {
            "type": "string"
          },
          "telegram_chat_id": {
            "type": "string"
          },
          "custom_webhook_url": {
            "type": "string"
          },
          "dedup_window_sec": {
            "type": "number"
          },
          "filter_logic": {
            "type": "string",
            "enum": [
              "AND",
              "OR"
            ]
          },
          "filters": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "field": {
                  "type": "string"
                },
                "operator": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                }
              }
            }
          },
          "template_title": {
            "type": "string"
          },
          "template_body": {
            "type": "string"
          },
          "ai_enrich": {
            "type": "boolean",
            "description": "Inject {{ai_summary}} and {{ai_sentiment}} into payload"
          }
        },
        "required": [
          "name"
        ]
      }
    },
    {
      "name": "rotate_route_token",
      "title": "Rotate a route ingest token",
      "description": "Cryptographically rotate a route's public whk_... webhook ingest token without altering the Master Passkey. The previous URL stops working immediately.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "route_id": {
            "type": "string",
            "description": "Target route ID (e.g. rt_1)"
          }
        },
        "required": [
          "route_id"
        ]
      }
    },
    {
      "name": "list_plans",
      "title": "List agent-purchasable plans",
      "description": "Return every subscription and credit top-up an AI agent can buy programmatically, with prices, quotas, accepted crypto currencies, and the checkout/claim endpoints. No authentication required.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "subscribe_plan",
      "title": "Buy a subscription (machine-payable)",
      "description": "Create a crypto checkout for a subscription plan and receive a concrete deposit address so an autonomous agent or treasury can settle it without a browser. Poll claim_subscription afterwards to obtain the Master Passkey.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "plan_id": {
            "type": "string",
            "description": "Plan from list_plans, e.g. neural_monthly, pro_monthly, agent_credit_100k"
          },
          "email": {
            "type": "string",
            "description": "Owner/operator email for receipts and passkey recovery"
          },
          "pay_currency": {
            "type": "string",
            "description": "Settlement currency, e.g. usdttrc20 (default), usdterc20, usdc, btc, eth, sol"
          },
          "existing_api_key": {
            "type": "string",
            "description": "Existing ef_live_... passkey when renewing, upgrading, or buying a credit top-up"
          },
          "callback_url": {
            "type": "string",
            "description": "HTTPS endpoint that receives HMAC-signed subscription.activated / quota.topped_up lifecycle events"
          },
          "agent": {
            "type": "object",
            "description": "Optional agent identity recorded on the subscription",
            "properties": {
              "name": {
                "type": "string"
              },
              "framework": {
                "type": "string"
              },
              "version": {
                "type": "string"
              },
              "homepage": {
                "type": "string"
              }
            }
          },
          "metadata": {
            "type": "object",
            "description": "Optional opaque metadata (<= 1024 bytes) stored with the subscription"
          }
        },
        "required": [
          "plan_id",
          "email"
        ]
      }
    },
    {
      "name": "claim_subscription",
      "title": "Claim a paid subscription",
      "description": "Exchange the claim_token from subscribe_plan for the provisioned Master Passkey. Poll until status is \"completed\"; returns api_key, tier, quota_limit and expiry.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "order_id": {
            "type": "string",
            "description": "order_id returned by subscribe_plan"
          },
          "claim_token": {
            "type": "string",
            "description": "claim_token returned by subscribe_plan"
          }
        },
        "required": [
          "order_id",
          "claim_token"
        ]
      }
    },
    {
      "name": "get_subscription_status",
      "title": "Read subscription and quota status",
      "description": "Return the authenticated passkey's tier, plan, quota usage, expiry, routes, registered agent identity and callback delivery history.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "purchase_quota_boost",
      "title": "Buy a credit top-up",
      "description": "Create a crypto checkout that adds extra webhook quota to an existing paid passkey (e.g. agent_credit_100k, apex_overage_500k). Poll claim_subscription afterwards.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "pack": {
            "type": "string",
            "description": "Credit pack plan_id, e.g. agent_credit_100k or apex_overage_500k"
          },
          "pay_currency": {
            "type": "string",
            "description": "Settlement currency, default usdttrc20"
          }
        },
        "required": [
          "pack"
        ]
      }
    },
    {
      "name": "set_agent_callback",
      "title": "Register an agent lifecycle callback",
      "description": "Register, rotate, or clear the HTTPS webhook that receives HMAC-signed subscription lifecycle events for this passkey.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "callback_url": {
            "type": "string",
            "description": "HTTPS endpoint, or an empty string to clear the callback"
          }
        },
        "required": [
          "callback_url"
        ]
      }
    },
    {
      "name": "synthesize_edge_ai",
      "title": "Synthesize Edge AI signal enrichment",
      "description": "Run EarlyFra.me Edge AI over a raw webhook payload (JSON, form, or plain text) and return ai_summary, ai_sentiment and ai_score. Requires Neural Frame.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "raw_payload": {
            "type": "string",
            "description": "Raw payload text or JSON to analyse"
          }
        },
        "required": [
          "raw_payload"
        ]
      }
    },
    {
      "name": "query_signal_memory",
      "title": "Query the edge signal memory",
      "description": "Read the durable state plane for a Master Passkey: recently archived webhook executions (delivered / filtered / retry_pending / dlq_failed) and the signal legs currently parked in a confluence window, so an agent can see what is waiting, what failed, and what has already fired.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "route_id": {
            "type": "string",
            "description": "Optional route_id filter (e.g. rt_1)"
          },
          "entity_key": {
            "type": "string",
            "description": "Optional entity scope filter, matching the route's stateful_gate.entity_field (e.g. SOLUSDT)"
          },
          "status_filter": {
            "type": "string",
            "enum": [
              "delivered",
              "filtered",
              "retry_pending",
              "dlq_failed",
              "dropped_cooldown",
              "dropped_blackout"
            ],
            "description": "Optional archive status filter"
          },
          "limit": {
            "type": "number",
            "description": "Max rows per bucket (1-50, default 20)"
          }
        }
      }
    },
    {
      "name": "arm_confluence_trap",
      "title": "Arm a multi-signal confluence trap",
      "description": "Programmatically arm or disarm a route's stateful signal gate: entity scope field, required confluence tags, sliding window and per-entity cooldown. Requires the Neural Frame tier. Use it to wait for N independent confirmations on the same entity before the route fires.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "route_id": {
            "type": "string",
            "description": "Target route ID (e.g. rt_1)"
          },
          "entity_field": {
            "type": "string",
            "description": "Dot-notation payload field that scopes the trap (default ticker)"
          },
          "required_tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Signal legs that must ALL arrive inside the window, e.g. [\"15m\",\"1h\"]"
          },
          "tag_field": {
            "type": "string",
            "description": "Field identifying the leg (default timeframe)"
          },
          "window_sec": {
            "type": "number",
            "description": "Confluence sliding window in seconds (30-86400, default 900)"
          },
          "cooldown_sec": {
            "type": "number",
            "description": "Mute repeat signals for the same entity for N seconds after firing (0 = off)"
          },
          "enabled": {
            "type": "boolean",
            "description": "Set false to disarm the trap without clearing the rest of the route"
          }
        },
        "required": [
          "route_id"
        ]
      }
    },
    {
      "name": "replay_historical_signal",
      "title": "Replay a historical signal",
      "description": "Re-run an ARCHIVED webhook against the route's CURRENT filter, enrichment, blackout, confluence and template rules — a time-travel backtest against real past traffic. dry_run=true reports the exact rule evaluation and transformed output without dispatching anything.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "route_id": {
            "type": "string",
            "description": "Route whose current rules should be applied (defaults to the first route)"
          },
          "event_id": {
            "type": "string",
            "description": "Archived event_id to replay (from query_signal_memory or inspect_live_telemetry)"
          },
          "dry_run": {
            "type": "boolean",
            "description": "true (default) = report only; false = re-dispatch through the current rules"
          }
        },
        "required": [
          "event_id"
        ]
      }
    }
  ]
}