{
  "schemaVersion": 1,
  "kind": "framediff-hosted-mcp",
  "name": "FrameDiff Hosted",
  "description": "Discover the authenticated FrameDiff Hosted MCP service. Use a project control link from Studio or the dashboard when access should be limited to one project.",
  "mcp": {
    "url": "https://api.framediff.com/mcp",
    "transport": "streamable-http",
    "authorization": {
      "type": "oauth2",
      "protectedResourceMetadata": "https://api.framediff.com/.well-known/oauth-protected-resource/mcp",
      "flow": "authorization_code_pkce",
      "continuity": "Request offline_access and store each rotated refresh token. Access is short-lived; FrameDiff adds no session timebox, so refresh continues while the provider OAuth session and account authority remain valid. On a 401 invalid_token challenge, refresh and retry. If refresh fails, start browser authorization again."
    }
  },
  "recommendedConnection": {
    "kind": "account-oauth",
    "url": "https://api.framediff.com/mcp",
    "scope": "All projects and account capabilities",
    "when": "Use once after signup for ongoing FrameDiff work across projects."
  },
  "routing": {
    "order": [
      "connected_account_mcp",
      "webmcp_signup",
      "browser_form_fallback"
    ],
    "connectedAccountMcp": {
      "url": "https://api.framediff.com/mcp",
      "firstTool": "framediff_account",
      "onSuccess": "The person is already signed up. Use this connection and do not create another account."
    },
    "webmcpSignup": {
      "url": "https://framediff.com/signup",
      "firstTool": "framediff_site_status",
      "finishTool": "framediff_finish_signup"
    },
    "browserFormFallback": {
      "url": "https://framediff.com/signup",
      "onlyWhen": "WebMCP tools are unavailable."
    },
    "completion": {
      "connectAccountMcp": true,
      "verifyWith": "framediff_account",
      "keepAsDefault": true
    }
  },
  "projectControlLinks": {
    "scope": "project",
    "location": "FrameDiff Studio Settings or the project dashboard",
    "secretHandling": "Project control URLs are bearer capabilities shown once. Do not paste them into public logs or commit them."
  },
  "signup": {
    "url": "https://framediff.com/signup",
    "agentInstructions": "https://framediff.com/agents",
    "manualBrowserFallback": true,
    "authentication": "Browser only; agents never receive credentials. An email code or Google sign-in with a new address creates the account; the same address later works with either method.",
    "remoteMcp": "After signup, connect the account MCP as the preferred durable agent connection. A remote MCP client without an account is sent to sign in during OAuth consent, which creates the account.",
    "tools": [
      "framediff_site_status",
      "framediff_send_email_code",
      "framediff_verify_email_code",
      "framediff_sign_in_with_google",
      "framediff_signup_status",
      "framediff_finish_signup"
    ]
  },
  "webmcp": {
    "availability": "Every page on https://framediff.com registers site-wide tools in a WebMCP-capable browser; pages add their own.",
    "siteTools": [
      "framediff_site_status",
      "framediff_send_email_code",
      "framediff_verify_email_code",
      "framediff_sign_in_with_google",
      "framediff_sign_out",
      "framediff_navigate"
    ],
    "pageTools": {
      "/": ["framediff_examples"],
      "/signup": ["framediff_signup_status", "framediff_finish_signup"],
      "/p/{slug}": ["framediff_public_project", "framediff_make_this_mine"],
      "/dashboard": ["framediff_dashboard_status", "framediff_dashboard_projects", "framediff_dashboard_refresh", "framediff_dashboard_create_project", "framediff_dashboard_open_project", "framediff_dashboard_delete_project", "framediff_dashboard_initialize_project", "framediff_dashboard_imports", "framediff_dashboard_access", "framediff_dashboard_agent_setup", "framediff_dashboard_github", "framediff_dashboard_upload_folder", "framediff_dashboard_keys", "framediff_dashboard_accounts", "framediff_dashboard_feedback"],
      "/oauth/consent": ["framediff_authorization_status", "framediff_authorize_agent", "framediff_deny_agent"]
    },
    "start": "Call framediff_site_status on any page; it reports the sign-in state and the next tool."
  }
}
