_ registry / mcp streamable-http · checked 57m ago

feelingsurf

https://api.feelingsurf.fr

Registry code: 346b13b40d9957a6

api record

FeelingSurf is a traffic exchange. Members earn credits by running FeelingSurfViewer, which visits other members' websites in the background, and those credits are spent automatically to send visits to the member's own active websites. These tools manage the authenticated member's account: websites (targeting, limits, schedule, traffic sources, labels), site templates, traffic sources, labels, proxies, surf sessions, referrals and screenshots. List tools are paginated with limit and offset. Update tools change only the fields you pass, and a list you pass replaces the stored one. Failures…

endpoint
https://api.feelingsurf.fr/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is feelingsurf live?
Yes — it answered the hub's last check (checked 57m ago). It answered 100% of checks over the last 30 days.
Is feelingsurf free to use?
No — it asks for a key or a login before it will serve.
What tools does feelingsurf have?
34 tools: get_account, list_sites, update_site_template, delete_label, get_site, get_referrals, get_traffic_availability, update_account, ….
Is feelingsurf safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
493ms

last good check

priced tools
0

of 34 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 34 tools
34 auth-required 34 of 34 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • get_account auth-required 57m ago

    Get the authenticated account. Account summary plus the earn-side rollup (credits earned today / last 7 days), active FeelingSurfViewer session count, and site-slot usage.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • list_sites auth-required never probed

    List your sites.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 200,
          "minimum": 1,
          "description": "Page size (clamped to 1..200)."
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Number of items to skip."
        }
      }
    }
    arguments 18 lines
  • update_site_template auth-required never probed

    Update a site template. Writable fields of a site template. For PATCH, provide at least one; only the fields present are changed.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        },
        "name": {
          "type": [
            "string",
            "null"
          ],
          "description": "Template name."
        },
        "limits": {
          "type": "object",
          "properties": {
            "daily": {
              "type": [
                "integer",
                "null"
              ],
              "maximum": 10000,
              "minimum": 1,
              "description": "Max visits per day; null means no limit."
            },
            "total": {
              "type": [
                "integer",
                "null"
              ],
              "maximum": 500000,
              "minimum": 1,
              "description": "Max visits in total (lifetime); null means no limit."
            },
            "hourly": {
              "type": "integer",
              "maximum": 500,
              "minimum": 1,
              "description": "Max visits per hour — always at least 1 (an hourly cap is mandatory)."
            }
          },
          "description": "Visit caps; null means no limit."
        },
        "actions": {
          "type": "object",
          "properties": {
            "items": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "type",
                  "ratio"
                ],
                "properties": {
                  "type": {
                    "enum": [
                      "click",
                      "click_rss",
                      "click_sitemap",
                      "cookie",
                      "scroll",
                      "refresh"
                    ],
                    "type": "string",
                    "description": "What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh."
                  },
                  "ratio": {
                    "type": "integer",
                    "maximum": 100,
                    "minimum": 0,
                    "description": "Percentage of visits that perform this action (default 100 = every visit)."
                  },
                  "cookie": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string",
                        "description": "Cookie name."
                      },
                      "value": {
                        "type": "string",
                        "description": "Cookie value."
                      },
                      "domain": {
                        "type": "string",
                        "description": "Domain to set the cookie on."
                      }
                    },
                    "description": "Present for cookie actions."
                  },
                  "element": {
                    "type": "object",
                    "properties": {
                      "type": {
                        "enum": [
                          "any",
                          "internal_link",
                          "external_link",
                          "link",
                          "button",
                          null
                        ],
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "What to click: any element, a same-domain link (`internal_link`), an off-domain link (`external_link`), any link (`link`), or a button.\n"
                      },
                      "selection": {
                        "enum": [
                          "random",
                          "first",
                          "last",
                          null
                        ],
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Which element to click when several match."
                      },
                      "url_filter": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Only click links whose URL contains this text; ignored when the element type is `button`."
                      },
                      "text_filter": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Only click elements whose visible text contains this."
                      }
                    },
                    "description": "Present for click-type actions."
                  }
                },
                "description": "A site action to apply. Same shape as SiteAction, but type and ratio are required."
              },
              "description": "The actions to perform."
            },
            "window": {
              "enum": [
                "latest",
                "first"
              ],
              "type": "string",
              "description": "Which opened browser window the actions target — the most recent (latest) or the first (first)."
            }
          },
          "description": "Auto-actions performed during visits."
        },
        "devices": {
          "type": "object",
          "properties": {
            "mobile": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to mobile devices."
            },
            "tablet": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to tablet devices."
            },
            "desktop": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to desktop devices."
            }
          },
          "description": "Device targeting split, as percentages summing to 100."
        },
        "browsing": {
          "type": "object",
          "properties": {
            "max_sub_windows": {
              "type": "integer",
              "maximum": 1,
              "minimum": 0,
              "description": "How many pop-up windows the visited site may open during a visit."
            }
          },
          "description": "Browsing options."
        },
        "schedule": {
          "type": "object",
          "properties": {
            "time_zone": {
              "type": [
                "string",
                "null"
              ],
              "description": "IANA time zone for the active-hours schedule (e.g. \"Europe/Paris\"); null uses your account timezone."
            },
            "active_hours_mask": {
              "type": [
                "string",
                "null"
              ],
              "description": "A weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is `1` (active that hour) or `0` (paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, in `time_zone`. `null` or all-`1`s means always on; at least one hour must be active, so an all-`0`s mask is rejected.\n"
            }
          },
          "description": "Active-hours scheduling."
        },
        "visit_duration": {
          "type": "object",
          "properties": {
            "max_seconds": {
              "type": "integer",
              "maximum": 600,
              "minimum": 10,
              "description": "Longest visit duration, in seconds."
            },
            "min_seconds": {
              "type": "integer",
              "maximum": 600,
              "minimum": 10,
              "description": "Shortest visit duration, in seconds."
            }
          },
          "description": "Visit duration range, in seconds."
        },
        "blocked_domains": {
          "type": "object",
          "properties": {
            "rate": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits to which domain blocking applies."
            },
            "domains": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Hostnames to block (e.g. `ads.example.com`; no scheme or path), one per entry. Up to 10."
            }
          },
          "description": "Domains blocked during visits."
        },
        "traffic_quality": {
          "type": "object",
          "properties": {
            "ipv6": {
              "type": "boolean",
              "description": "Whether IPv6 visitors may deliver visits to this site."
            },
            "low_quality_ips": {
              "type": "boolean",
              "description": "Whether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site."
            }
          },
          "description": "Traffic quality controls."
        },
        "traffic_sources": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "IDs of traffic sources to assign."
        },
        "location_targeting": {
          "type": "object",
          "properties": {
            "mode": {
              "enum": [
                "include",
                "exclude"
              ],
              "type": "string",
              "description": "Whether the locations list is an allow-list (include) or a block-list (exclude)."
            },
            "locations": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "description": "ISO country code (alpha-2) or continent code, per type."
                  },
                  "type": {
                    "enum": [
                      "country",
                      "continent"
                    ],
                    "type": "string",
                    "description": "Whether code is a country or a continent."
                  }
                }
              },
              "description": "The countries/continents to include or exclude."
            }
          },
          "description": "Country/continent targeting."
        },
        "visit_distribution": {
          "enum": [
            "even",
            "asap"
          ],
          "type": "string",
          "description": "How visits are paced — \"even\" spreads them across the day, \"asap\" delivers as fast as possible."
        }
      }
    }
    arguments 319 lines
  • delete_label auth-required never probed

    Delete a label.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        }
      }
    }
    arguments 13 lines
  • get_site auth-required never probed

    Get one site.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Site identifier."
        }
      }
    }
    arguments 13 lines
  • get_referrals auth-required 57m ago

    Get your referral program. Your shareable referral link, how many users you've referred, your commission rate, and commission credits earned.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_traffic_availability auth-required 57m ago

    Traffic availability by country. Surfer-traffic availability per country, to guide a site's or template's location targeting. A country with `availability: none` has no surfers delivering visits, so targeting it yields nothing. A fixed reference dataset (~250 countries), returned in full — not paginated.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • update_account auth-required never probed

    Update account settings. Update non-sensitive account settings (e.g. `visit_own_sites`, `timezone`). Writable account settings. Provide at least one. Email, password and billing are intentionally not editable via the API.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "currency": {
          "enum": [
            "eur",
            "usd"
          ],
          "type": "string",
          "description": "Your billing currency."
        },
        "language": {
          "enum": [
            "en",
            "fr",
            "es",
            "pt",
            "ru",
            "vi",
            "id",
            "tr",
            "de",
            "it",
            "nl"
          ],
          "type": "string",
          "description": "Your account language (ISO code)."
        },
        "timezone": {
          "type": [
            "string",
            "null"
          ],
          "description": "An IANA timezone name (e.g. \"Europe/Paris\"), or null to clear (scheduling then uses UTC)."
        },
        "newsletter": {
          "type": "boolean",
          "description": "Newsletter email opt-in."
        },
        "invoice_emails": {
          "type": "boolean",
          "description": "Whether invoice emails are sent."
        },
        "visit_own_sites": {
          "type": "boolean",
          "description": "Whether the app also surfs your own sites."
        }
      }
    }
    arguments 49 lines
  • list_surf_sessions auth-required never probed

    List your FeelingSurfViewer sessions. Recent FeelingSurfViewer sessions on your account (the earning side), most recent first. These are your own FeelingSurfViewer instances and their IPs.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 200,
          "minimum": 1,
          "description": "Page size (clamped to 1..200)."
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Number of items to skip."
        }
      }
    }
    arguments 18 lines
  • create_site auth-required never probed

    Create a site. Only `url` is required; every other field defaults to a new-site configuration. Exceeding the account's slot count returns 403 `site_limit_reached`. Fields for creating a site. Only `url` is required; all others default to a new-site configuration. When `template_id` is given, that template's settings seed the defaults and any field set explicitly here overrides them (shallow, per top-level key).

    mcp-tool

    {
      "type": "object",
      "required": [
        "url"
      ],
      "properties": {
        "url": {
          "type": "string",
          "description": "The website's URL."
        },
        "name": {
          "type": [
            "string",
            "null"
          ],
          "description": "User-chosen name; null clears it."
        },
        "labels": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "IDs of labels to assign."
        },
        "limits": {
          "type": "object",
          "properties": {
            "daily": {
              "type": [
                "integer",
                "null"
              ],
              "maximum": 10000,
              "minimum": 1,
              "description": "Max visits per day; null means no limit."
            },
            "total": {
              "type": [
                "integer",
                "null"
              ],
              "maximum": 500000,
              "minimum": 1,
              "description": "Max visits in total (lifetime); null means no limit."
            },
            "hourly": {
              "type": "integer",
              "maximum": 500,
              "minimum": 1,
              "description": "Max visits per hour — always at least 1 (an hourly cap is mandatory)."
            }
          },
          "description": "Visit caps; null means no limit."
        },
        "paused": {
          "type": "boolean",
          "description": "Pause or resume visit delivery."
        },
        "actions": {
          "type": "object",
          "properties": {
            "items": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "type",
                  "ratio"
                ],
                "properties": {
                  "type": {
                    "enum": [
                      "click",
                      "click_rss",
                      "click_sitemap",
                      "cookie",
                      "scroll",
                      "refresh"
                    ],
                    "type": "string",
                    "description": "What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh."
                  },
                  "ratio": {
                    "type": "integer",
                    "maximum": 100,
                    "minimum": 0,
                    "description": "Percentage of visits that perform this action (default 100 = every visit)."
                  },
                  "cookie": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string",
                        "description": "Cookie name."
                      },
                      "value": {
                        "type": "string",
                        "description": "Cookie value."
                      },
                      "domain": {
                        "type": "string",
                        "description": "Domain to set the cookie on."
                      }
                    },
                    "description": "Present for cookie actions."
                  },
                  "element": {
                    "type": "object",
                    "properties": {
                      "type": {
                        "enum": [
                          "any",
                          "internal_link",
                          "external_link",
                          "link",
                          "button",
                          null
                        ],
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "What to click: any element, a same-domain link (`internal_link`), an off-domain link (`external_link`), any link (`link`), or a button.\n"
                      },
                      "selection": {
                        "enum": [
                          "random",
                          "first",
                          "last",
                          null
                        ],
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Which element to click when several match."
                      },
                      "url_filter": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Only click links whose URL contains this text; ignored when the element type is `button`."
                      },
                      "text_filter": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Only click elements whose visible text contains this."
                      }
                    },
                    "description": "Present for click-type actions."
                  }
                },
                "description": "A site action to apply. Same shape as SiteAction, but type and ratio are required."
              },
              "description": "The actions to perform."
            },
            "window": {
              "enum": [
                "latest",
                "first"
              ],
              "type": "string",
              "description": "Which opened browser window the actions target — the most recent (latest) or the first (first)."
            }
          },
          "description": "Auto-actions performed during visits."
        },
        "devices": {
          "type": "object",
          "properties": {
            "mobile": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to mobile devices."
            },
            "tablet": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to tablet devices."
            },
            "desktop": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to desktop devices."
            }
          },
          "description": "Device targeting split, as percentages summing to 100."
        },
        "browsing": {
          "type": "object",
          "properties": {
            "max_sub_windows": {
              "type": "integer",
              "maximum": 1,
              "minimum": 0,
              "description": "How many pop-up windows the visited site may open during a visit."
            }
          },
          "description": "Browsing options."
        },
        "schedule": {
          "type": "object",
          "properties": {
            "time_zone": {
              "type": [
                "string",
                "null"
              ],
              "description": "IANA time zone for the active-hours schedule (e.g. \"Europe/Paris\"); null uses your account timezone."
            },
            "active_hours_mask": {
              "type": [
                "string",
                "null"
              ],
              "description": "A weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is `1` (active that hour) or `0` (paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, in `time_zone`. `null` or all-`1`s means always on; at least one hour must be active, so an all-`0`s mask is rejected.\n"
            }
          },
          "description": "Active-hours scheduling."
        },
        "template_id": {
          "type": "integer",
          "format": "int64",
          "description": "A site template to apply as the base configuration. Must be one of your own templates; an unknown id returns 422. The template's settings become the defaults; any field you also send in this request overrides the template's value for that whole field (shallow merge, per top-level field).\n"
        },
        "visit_duration": {
          "type": "object",
          "properties": {
            "max_seconds": {
              "type": "integer",
              "maximum": 600,
              "minimum": 10,
              "description": "Longest visit duration, in seconds."
            },
            "min_seconds": {
              "type": "integer",
              "maximum": 600,
              "minimum": 10,
              "description": "Shortest visit duration, in seconds."
            }
          },
          "description": "Visit duration range, in seconds."
        },
        "blocked_domains": {
          "type": "object",
          "properties": {
            "rate": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits to which domain blocking applies."
            },
            "domains": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Hostnames to block (e.g. `ads.example.com`; no scheme or path), one per entry. Up to 10."
            }
          },
          "description": "Domains blocked during visits."
        },
        "traffic_quality": {
          "type": "object",
          "properties": {
            "ipv6": {
              "type": "boolean",
              "description": "Whether IPv6 visitors may deliver visits to this site."
            },
            "low_quality_ips": {
              "type": "boolean",
              "description": "Whether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site."
            }
          },
          "description": "Traffic quality controls."
        },
        "traffic_sources": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "IDs of traffic sources to assign; an empty list assigns the default \"Direct visits\" source."
        },
        "location_targeting": {
          "type": "object",
          "properties": {
            "mode": {
              "enum": [
                "include",
                "exclude"
              ],
              "type": "string",
              "description": "Whether the locations list is an allow-list (include) or a block-list (exclude)."
            },
            "locations": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "description": "ISO country code (alpha-2) or continent code, per type."
                  },
                  "type": {
                    "enum": [
                      "country",
                      "continent"
                    ],
                    "type": "string",
                    "description": "Whether code is a country or a continent."
                  }
                }
              },
              "description": "The countries/continents to include or exclude."
            }
          },
          "description": "Country/continent targeting."
        },
        "visit_distribution": {
          "enum": [
            "even",
            "asap"
          ],
          "type": "string",
          "description": "How visits are paced — \"even\" spreads them across the day, \"asap\" delivers as fast as possible."
        }
      }
    }
    arguments 334 lines
  • update_site auth-required never probed

    Update a site. Writable fields of a site. For PATCH, provide at least one; only the fields present are changed.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Site identifier."
        },
        "name": {
          "type": [
            "string",
            "null"
          ],
          "description": "User-chosen name; null clears it."
        },
        "labels": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "IDs of labels to assign."
        },
        "limits": {
          "type": "object",
          "properties": {
            "daily": {
              "type": [
                "integer",
                "null"
              ],
              "maximum": 10000,
              "minimum": 1,
              "description": "Max visits per day; null means no limit."
            },
            "total": {
              "type": [
                "integer",
                "null"
              ],
              "maximum": 500000,
              "minimum": 1,
              "description": "Max visits in total (lifetime); null means no limit."
            },
            "hourly": {
              "type": "integer",
              "maximum": 500,
              "minimum": 1,
              "description": "Max visits per hour — always at least 1 (an hourly cap is mandatory)."
            }
          },
          "description": "Visit caps; null means no limit."
        },
        "paused": {
          "type": "boolean",
          "description": "Pause or resume visit delivery."
        },
        "actions": {
          "type": "object",
          "properties": {
            "items": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "type",
                  "ratio"
                ],
                "properties": {
                  "type": {
                    "enum": [
                      "click",
                      "click_rss",
                      "click_sitemap",
                      "cookie",
                      "scroll",
                      "refresh"
                    ],
                    "type": "string",
                    "description": "What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh."
                  },
                  "ratio": {
                    "type": "integer",
                    "maximum": 100,
                    "minimum": 0,
                    "description": "Percentage of visits that perform this action (default 100 = every visit)."
                  },
                  "cookie": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string",
                        "description": "Cookie name."
                      },
                      "value": {
                        "type": "string",
                        "description": "Cookie value."
                      },
                      "domain": {
                        "type": "string",
                        "description": "Domain to set the cookie on."
                      }
                    },
                    "description": "Present for cookie actions."
                  },
                  "element": {
                    "type": "object",
                    "properties": {
                      "type": {
                        "enum": [
                          "any",
                          "internal_link",
                          "external_link",
                          "link",
                          "button",
                          null
                        ],
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "What to click: any element, a same-domain link (`internal_link`), an off-domain link (`external_link`), any link (`link`), or a button.\n"
                      },
                      "selection": {
                        "enum": [
                          "random",
                          "first",
                          "last",
                          null
                        ],
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Which element to click when several match."
                      },
                      "url_filter": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Only click links whose URL contains this text; ignored when the element type is `button`."
                      },
                      "text_filter": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Only click elements whose visible text contains this."
                      }
                    },
                    "description": "Present for click-type actions."
                  }
                },
                "description": "A site action to apply. Same shape as SiteAction, but type and ratio are required."
              },
              "description": "The actions to perform."
            },
            "window": {
              "enum": [
                "latest",
                "first"
              ],
              "type": "string",
              "description": "Which opened browser window the actions target — the most recent (latest) or the first (first)."
            }
          },
          "description": "Auto-actions performed during visits."
        },
        "devices": {
          "type": "object",
          "properties": {
            "mobile": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to mobile devices."
            },
            "tablet": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to tablet devices."
            },
            "desktop": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to desktop devices."
            }
          },
          "description": "Device targeting split, as percentages summing to 100."
        },
        "browsing": {
          "type": "object",
          "properties": {
            "max_sub_windows": {
              "type": "integer",
              "maximum": 1,
              "minimum": 0,
              "description": "How many pop-up windows the visited site may open during a visit."
            }
          },
          "description": "Browsing options."
        },
        "schedule": {
          "type": "object",
          "properties": {
            "time_zone": {
              "type": [
                "string",
                "null"
              ],
              "description": "IANA time zone for the active-hours schedule (e.g. \"Europe/Paris\"); null uses your account timezone."
            },
            "active_hours_mask": {
              "type": [
                "string",
                "null"
              ],
              "description": "A weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is `1` (active that hour) or `0` (paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, in `time_zone`. `null` or all-`1`s means always on; at least one hour must be active, so an all-`0`s mask is rejected.\n"
            }
          },
          "description": "Active-hours scheduling."
        },
        "visit_duration": {
          "type": "object",
          "properties": {
            "max_seconds": {
              "type": "integer",
              "maximum": 600,
              "minimum": 10,
              "description": "Longest visit duration, in seconds."
            },
            "min_seconds": {
              "type": "integer",
              "maximum": 600,
              "minimum": 10,
              "description": "Shortest visit duration, in seconds."
            }
          },
          "description": "Visit duration range, in seconds."
        },
        "blocked_domains": {
          "type": "object",
          "properties": {
            "rate": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits to which domain blocking applies."
            },
            "domains": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Hostnames to block (e.g. `ads.example.com`; no scheme or path), one per entry. Up to 10."
            }
          },
          "description": "Domains blocked during visits."
        },
        "traffic_quality": {
          "type": "object",
          "properties": {
            "ipv6": {
              "type": "boolean",
              "description": "Whether IPv6 visitors may deliver visits to this site."
            },
            "low_quality_ips": {
              "type": "boolean",
              "description": "Whether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site."
            }
          },
          "description": "Traffic quality controls."
        },
        "traffic_sources": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "IDs of traffic sources to assign; an empty list assigns the default \"Direct visits\" source."
        },
        "location_targeting": {
          "type": "object",
          "properties": {
            "mode": {
              "enum": [
                "include",
                "exclude"
              ],
              "type": "string",
              "description": "Whether the locations list is an allow-list (include) or a block-list (exclude)."
            },
            "locations": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "description": "ISO country code (alpha-2) or continent code, per type."
                  },
                  "type": {
                    "enum": [
                      "country",
                      "continent"
                    ],
                    "type": "string",
                    "description": "Whether code is a country or a continent."
                  }
                }
              },
              "description": "The countries/continents to include or exclude."
            }
          },
          "description": "Country/continent targeting."
        },
        "visit_distribution": {
          "enum": [
            "even",
            "asap"
          ],
          "type": "string",
          "description": "How visits are paced — \"even\" spreads them across the day, \"asap\" delivers as fast as possible."
        }
      }
    }
    arguments 330 lines
  • delete_site auth-required never probed

    Delete a site.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Site identifier."
        }
      }
    }
    arguments 13 lines
  • list_deleted_sites auth-required never probed

    List sites you can still restore. Sites you deleted within the retention window, most recently deleted first. Sites removed because a plan downgrade reduced your slot count are not listed: those come back on their own when you upgrade again.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 200,
          "minimum": 1,
          "description": "Page size (clamped to 1..200)."
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Number of items to skip."
        }
      }
    }
    arguments 18 lines
  • restore_site auth-required never probed

    Restore a deleted site. Brings back a site you deleted, with the settings it had. Geo targeting, blocked domains and actions your plan cannot use stay suspended and come back empty. Returns 404 once the retention window has passed, and 403 `site_limit_reached` when you have no free slot.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Site identifier."
        }
      }
    }
    arguments 13 lines
  • list_site_screenshots auth-required never probed

    List a site's FeelingSurfViewer screenshots. Screenshots captured while the app surfed the site. Returns the most recent (up to 24); this list is not paginated.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Site identifier."
        }
      }
    }
    arguments 13 lines
  • get_screenshot auth-required never probed

    Get a screenshot image. Returns the image FeelingSurfViewer captured. The uid is the last path segment of an `images[].url` from list_site_screenshots.

    mcp-tool

    {
      "type": "object",
      "required": [
        "uid"
      ],
      "properties": {
        "uid": {
          "type": "string"
        }
      }
    }
    arguments 11 lines
  • list_site_templates auth-required never probed

    List your site templates.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 200,
          "minimum": 1,
          "description": "Page size (clamped to 1..200)."
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Number of items to skip."
        }
      }
    }
    arguments 18 lines
  • get_site_template auth-required never probed

    Get one site template.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        }
      }
    }
    arguments 13 lines
  • create_site_template auth-required never probed

    Create a site template. A template is a reusable bundle of site settings (no url/paused/labels). Only `name` is required; every other field defaults to a new-template configuration. Exceeding the per-account cap returns 403 `template_limit_reached`. Fields for creating a site template. Only `name` is required; all others default to a new-template configuration.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Template name."
        },
        "limits": {
          "type": "object",
          "properties": {
            "daily": {
              "type": [
                "integer",
                "null"
              ],
              "maximum": 10000,
              "minimum": 1,
              "description": "Max visits per day; null means no limit."
            },
            "total": {
              "type": [
                "integer",
                "null"
              ],
              "maximum": 500000,
              "minimum": 1,
              "description": "Max visits in total (lifetime); null means no limit."
            },
            "hourly": {
              "type": "integer",
              "maximum": 500,
              "minimum": 1,
              "description": "Max visits per hour — always at least 1 (an hourly cap is mandatory)."
            }
          },
          "description": "Visit caps; null means no limit."
        },
        "actions": {
          "type": "object",
          "properties": {
            "items": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "type",
                  "ratio"
                ],
                "properties": {
                  "type": {
                    "enum": [
                      "click",
                      "click_rss",
                      "click_sitemap",
                      "cookie",
                      "scroll",
                      "refresh"
                    ],
                    "type": "string",
                    "description": "What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh."
                  },
                  "ratio": {
                    "type": "integer",
                    "maximum": 100,
                    "minimum": 0,
                    "description": "Percentage of visits that perform this action (default 100 = every visit)."
                  },
                  "cookie": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string",
                        "description": "Cookie name."
                      },
                      "value": {
                        "type": "string",
                        "description": "Cookie value."
                      },
                      "domain": {
                        "type": "string",
                        "description": "Domain to set the cookie on."
                      }
                    },
                    "description": "Present for cookie actions."
                  },
                  "element": {
                    "type": "object",
                    "properties": {
                      "type": {
                        "enum": [
                          "any",
                          "internal_link",
                          "external_link",
                          "link",
                          "button",
                          null
                        ],
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "What to click: any element, a same-domain link (`internal_link`), an off-domain link (`external_link`), any link (`link`), or a button.\n"
                      },
                      "selection": {
                        "enum": [
                          "random",
                          "first",
                          "last",
                          null
                        ],
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Which element to click when several match."
                      },
                      "url_filter": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Only click links whose URL contains this text; ignored when the element type is `button`."
                      },
                      "text_filter": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Only click elements whose visible text contains this."
                      }
                    },
                    "description": "Present for click-type actions."
                  }
                },
                "description": "A site action to apply. Same shape as SiteAction, but type and ratio are required."
              },
              "description": "The actions to perform."
            },
            "window": {
              "enum": [
                "latest",
                "first"
              ],
              "type": "string",
              "description": "Which opened browser window the actions target — the most recent (latest) or the first (first)."
            }
          },
          "description": "Auto-actions performed during visits."
        },
        "devices": {
          "type": "object",
          "properties": {
            "mobile": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to mobile devices."
            },
            "tablet": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to tablet devices."
            },
            "desktop": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits sent to desktop devices."
            }
          },
          "description": "Device targeting split, as percentages summing to 100."
        },
        "browsing": {
          "type": "object",
          "properties": {
            "max_sub_windows": {
              "type": "integer",
              "maximum": 1,
              "minimum": 0,
              "description": "How many pop-up windows the visited site may open during a visit."
            }
          },
          "description": "Browsing options."
        },
        "schedule": {
          "type": "object",
          "properties": {
            "time_zone": {
              "type": [
                "string",
                "null"
              ],
              "description": "IANA time zone for the active-hours schedule (e.g. \"Europe/Paris\"); null uses your account timezone."
            },
            "active_hours_mask": {
              "type": [
                "string",
                "null"
              ],
              "description": "A weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is `1` (active that hour) or `0` (paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, in `time_zone`. `null` or all-`1`s means always on; at least one hour must be active, so an all-`0`s mask is rejected.\n"
            }
          },
          "description": "Active-hours scheduling."
        },
        "visit_duration": {
          "type": "object",
          "properties": {
            "max_seconds": {
              "type": "integer",
              "maximum": 600,
              "minimum": 10,
              "description": "Longest visit duration, in seconds."
            },
            "min_seconds": {
              "type": "integer",
              "maximum": 600,
              "minimum": 10,
              "description": "Shortest visit duration, in seconds."
            }
          },
          "description": "Visit duration range, in seconds."
        },
        "blocked_domains": {
          "type": "object",
          "properties": {
            "rate": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0,
              "description": "Percentage of visits to which domain blocking applies."
            },
            "domains": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Hostnames to block (e.g. `ads.example.com`; no scheme or path), one per entry. Up to 10."
            }
          },
          "description": "Domains blocked during visits."
        },
        "traffic_quality": {
          "type": "object",
          "properties": {
            "ipv6": {
              "type": "boolean",
              "description": "Whether IPv6 visitors may deliver visits to this site."
            },
            "low_quality_ips": {
              "type": "boolean",
              "description": "Whether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site."
            }
          },
          "description": "Traffic quality controls."
        },
        "traffic_sources": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "IDs of traffic sources to assign."
        },
        "location_targeting": {
          "type": "object",
          "properties": {
            "mode": {
              "enum": [
                "include",
                "exclude"
              ],
              "type": "string",
              "description": "Whether the locations list is an allow-list (include) or a block-list (exclude)."
            },
            "locations": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "description": "ISO country code (alpha-2) or continent code, per type."
                  },
                  "type": {
                    "enum": [
                      "country",
                      "continent"
                    ],
                    "type": "string",
                    "description": "Whether code is a country or a continent."
                  }
                }
              },
              "description": "The countries/continents to include or exclude."
            }
          },
          "description": "Country/continent targeting."
        },
        "visit_distribution": {
          "enum": [
            "even",
            "asap"
          ],
          "type": "string",
          "description": "How visits are paced — \"even\" spreads them across the day, \"asap\" delivers as fast as possible."
        }
      }
    }
    arguments 311 lines
  • delete_site_template auth-required never probed

    Delete a site template.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        }
      }
    }
    arguments 13 lines
  • list_traffic_sources auth-required never probed

    List your traffic sources. Your own sources plus the shared/built-in ones, referenced by id from a site's `traffic_sources`.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 200,
          "minimum": 1,
          "description": "Page size (clamped to 1..200)."
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Number of items to skip."
        }
      }
    }
    arguments 18 lines
  • get_traffic_source auth-required never probed

    Get one traffic source. Works for your own sources and for the shared defaults (e.g. id 1, "Direct visits").

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        }
      }
    }
    arguments 13 lines
  • create_traffic_source auth-required never probed

    Create a traffic source. Exceeding the per-account source cap returns 403 `limit_reached`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name",
        "referer"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the traffic source; a default is shown when unset."
        },
        "referer": {
          "type": "string",
          "description": "The referer to report to the target site (a domain or full URL, e.g. `https://www.google.com/`); the scheme is stripped on save."
        }
      }
    }
    arguments 17 lines
  • update_traffic_source auth-required never probed

    Update a traffic source. Provide at least one field.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        },
        "name": {
          "type": "string",
          "description": "Name of the traffic source; a default is shown when unset."
        },
        "referer": {
          "type": "string",
          "description": "The referer to report to the target site (a domain or full URL, e.g. `https://www.google.com/`); the scheme is stripped on save."
        }
      }
    }
    arguments 21 lines
  • delete_traffic_source auth-required never probed

    Delete a traffic source.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        }
      }
    }
    arguments 13 lines
  • list_proxies auth-required never probed

    List your proxies. Every proxy on your account, oldest first.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 200,
          "minimum": 1,
          "description": "Page size (clamped to 1..200)."
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Number of items to skip."
        }
      }
    }
    arguments 18 lines
  • get_proxy auth-required never probed

    Get one proxy.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        }
      }
    }
    arguments 13 lines
  • create_proxy auth-required never probed

    Add a proxy. Registers a static proxy. FeelingSurfViewer checks it before any session goes through it, so a new proxy starts with `proven` false. Exceeding the per-account proxy cap returns 403 `proxy_limit_reached`; a host and port already on your account returns 422 `validation_error`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "host",
        "port"
      ],
      "properties": {
        "host": {
          "type": "string",
          "description": "The proxy's public IPv4 or IPv6 address. Hostnames and private addresses are rejected; IPv6 is stored in its compressed form."
        },
        "port": {
          "type": "integer",
          "maximum": 65535,
          "minimum": 1,
          "description": "The proxy's port."
        },
        "type": {
          "enum": [
            "http",
            "https",
            "socks5"
          ],
          "type": "string",
          "default": "http",
          "description": "The proxy protocol, case-insensitive."
        },
        "password": {
          "type": "string",
          "description": "Password for an `http` or `https` proxy. Not allowed with `socks5`."
        },
        "username": {
          "type": "string",
          "description": "Username for an `http` or `https` proxy. Not allowed with `socks5`."
        }
      }
    }
    arguments 37 lines
  • update_proxy auth-required never probed

    Pause or resume a proxy. Only `enabled` can change. Pausing or resuming clears `last_error` and its error history, and a resumed proxy is checked again at once, so this also brings back a proxy that was switched off after failing. To change the host, port or credentials, delete the proxy and add it again.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "enabled"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        },
        "enabled": {
          "type": "boolean",
          "description": "False pauses the proxy, true resumes it."
        }
      }
    }
    arguments 18 lines
  • delete_proxy auth-required never probed

    Remove a proxy.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        }
      }
    }
    arguments 13 lines
  • list_labels auth-required never probed

    List your labels. Referenced by id from a site's `labels`.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 200,
          "minimum": 1,
          "description": "Page size (clamped to 1..200)."
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Number of items to skip."
        }
      }
    }
    arguments 18 lines
  • get_label auth-required never probed

    Get one label.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        }
      }
    }
    arguments 13 lines
  • create_label auth-required never probed

    Create a label. Exceeding the per-account label cap returns 403 `limit_reached`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name",
        "color"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Label name."
        },
        "color": {
          "enum": [
            "#6610f2",
            "#6f42c1",
            "#d63384",
            "#dc3545",
            "#fd7e14",
            "#ffc107",
            "#198754",
            "#20c997",
            "#0dcaf0",
            "#6c757d",
            "#343a40"
          ],
          "type": "string",
          "description": "Label color."
        },
        "description": {
          "type": [
            "string",
            "null"
          ],
          "description": "Optional notes."
        }
      }
    }
    arguments 37 lines
  • update_label auth-required never probed

    Update a label. Provide at least one field.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64",
          "description": "Resource identifier."
        },
        "name": {
          "type": "string",
          "description": "Label name."
        },
        "color": {
          "enum": [
            "#6610f2",
            "#6f42c1",
            "#d63384",
            "#dc3545",
            "#fd7e14",
            "#ffc107",
            "#198754",
            "#20c997",
            "#0dcaf0",
            "#6c757d",
            "#343a40"
          ],
          "type": "string",
          "description": "Label color."
        },
        "description": {
          "type": [
            "string",
            "null"
          ],
          "description": "Optional notes."
        }
      }
    }
    arguments 41 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 346b13b40d9957a6.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/346b13b40d9957a6/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/346b13b40d9957a6/badge.svg)](https://brick.blue/agent/346b13b40d9957a6?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.