Sponsored by Deepsite.site

Rock.so Mcp

创建者
Rock.so2 months ago
Rock.so MCP connects your Rock workspace to any MCP client. With a Personal Access Token, your AI assistant works across all your spaces as you: universal search, plus read and write for messages, tasks, notes, and files. Hosted over Streamable HTTP with Bearer auth, on every Rock plan including Free.
概览
would be function-scoped and the cta_click tracker below // (which guards on typeof gtag) would never fire. On live (Webflow) this // snippet is top-level, making gtag global — window.gtag restores that. window.dataLayer = window.dataLayer || []; window.gtag = function(){dataLayer.push(arguments);};

// Consent Mode v2 defaults. MUST be queued before gtag('config') — Google processes // dataLayer in order and ignores a 'default' that arrives after config, so flipping // these two lines silently disables consent mode rather than erroring. // // Everything starts denied. CookieConsent.astro resolves the tier and pushes the // 'update' → granted. Starting denied and upgrading is always safe; the reverse leaks. gtag('consent', 'default', { ad_storage: 'denied', ad_user_data: 'denied', ad_personalization: 'denied', analytics_storage: 'denied', functionality_storage: 'denied', personalization_storage: 'denied', security_storage: 'granted' });

// ⚠️ gtag('js') + gtag('config') are DELIBERATELY NOT called here. // // gtag.js drains dataLayer in order, and 'config' is what fires the first page_view. // Pushing config synchronously here puts it AHEAD of the async consent update (which // can only happen after the geo lookup), so the session-establishing hit goes out under // the denied default. Verified on the wire before this was fixed: the first collect had // gcs=G100 and only the follow-up user_engagement hit carried gcs=G111&gcut=3. // // Instead __rkApplyConsent() calls this once analytics consent is known to be granted, // guaranteeing the queue order default → update → config for every path (Standard on // boot, Strict on Accept, and either tier restoring a stored grant). When consent is // denied we never call it at all — gtag.js is gated and never loads, so there is nothing // to configure. Idempotent: safe to call on every consent transition. var gtagStarted = false; var gtagConfigured = false; // deferConfig=true pushes gtag('js') but HOLDS gtag('config') — the call that fires the first // page_view — until __rkGtagConfig() runs on gtag.js's own load event. The Standard direct- // activation path uses this so a Reject that lands while gtag.js is still downloading is queued // AHEAD of config, and the page_view then carries the denied signals instead of granted. Strict // (Finsweet-activated) keeps the eager path: gtag.js only loads post-Accept, so config is // legitimately granted and there is no in-flight-Reject window to lose. window.__rkGtagConfig = function () { if (gtagConfigured) return; gtagConfigured = true; gtag('config', GA_ID); }; window.__rkGtagInit = function (deferConfig) { if (gtagStarted) return; gtagStarted = true; gtag('js', new Date()); if (!deferConfig) window.__rkGtagConfig(); }; })(); does not exist in the bundle — an earlier // draft called opt_out_capturing({clear_persistence:true}), which is silently ignored. // Stopping capture, clearing stored state and disabling future persistence are three // separate calls. (function () { 'use strict';

function withPostHog(fn) {
  // The grant signal can fire before Finsweet has activated the PostHog snippet, so
  // latch and replay rather than assuming it exists.
  var tries = 0;
  (function attempt() {
    if (window.posthog && window.posthog.__loaded) { try { fn(window.posthog); } catch (e) {} return; }
    if (++tries > 40) return;               // ~4s, then give up quietly
    setTimeout(attempt, 100);
  })();
}

// c = { analytics, marketing, personalization } — the same category→storage mapping Finsweet
// uses in loadConsents(), mirrored so our signals and any future Finsweet-native ones can't
// disagree. opts.deferGtagConfig holds gtag('config') until gtag.js loads (Standard direct-
// activation), so a Reject mid-load isn't lost. phDesired is the latest analytics intent;
// whichever PostHog latch fires reads it, so grant-then-quick-Reject ends opted OUT, not in.
var phDesired = null;
function applyPostHogState(ph) {
  if (phDesired) {
    if (ph.set_config) ph.set_config({ persistence: 'localStorage+cookie' });
    if (ph.opt_in_capturing) ph.opt_in_capturing();
  } else {
    // ORDER MATTERS: reset() clears stored state incl. the opt-out flag, so record the opt-out
    // LAST or it is silently wiped (verified: has_opted_out_capturing()===false with the
    // intuitive order). Clear, stop persisting, then opt out.
    if (ph.reset) ph.reset();
    if (ph.set_config) ph.set_config({ persistence: 'memory' });
    if (ph.opt_out_capturing) ph.opt_out_capturing();
  }
}

window.__rkApplyConsent = function (c, opts) {
  c = c || {};
  opts = opts || {};
  var ads = c.marketing ? 'granted' : 'denied';
  var prefs = c.personalization ? 'granted' : 'denied';

  if (typeof window.gtag === 'function') {
    gtag('consent', 'update', {
      ad_storage: ads,
      ad_user_data: ads,
      ad_personalization: ads,
      analytics_storage: c.analytics ? 'granted' : 'denied',
      functionality_storage: prefs,
      personalization_storage: prefs
    });
  }

  phDesired = !!c.analytics;
  if (c.analytics) {
    // Push gtag('js'); config fires now (Strict) or on gtag.js load (Standard: deferGtagConfig).
    if (window.__rkGtagInit) window.__rkGtagInit(opts.deferGtagConfig);
    withPostHog(applyPostHogState);                 // opt in once the SDK is live
  } else if (window.posthog) {
    // Revoke — latch even if not __loaded yet: a Reject during load must still opt out, or the
    // grant latch opts it back in once the SDK loads. applyPostHogState reads the latest
    // phDesired, so whichever latch fires applies the final intent. Guard on the stub existing
    // so a stored-Reject visitor (snippet never ran) doesn't poll pointlessly every page load.
    withPostHog(applyPostHogState);
  }
};

})();

!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys onSessionId".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]); posthog.init(POSTHOG_KEY,{api_host:'https://app.posthog.com'}); })();

// Named, destination-classified CTA click tracking for the rock.so marketing // site + blog/templates. Replaces the signal lost when $autocapture was turned // off (June 2026). One event, richly propertied, so signup intent that used to // be split across "Sign up" / "Start for Free" / "Get Started" collapses into a // single cta_type you can break down by location and page. // // Part A: fire cta_clicked on conversion CTAs. // Part B: append UTM attribution to outbound web.rock.so links at click time so // the app side can attribute the eventual signup to the source page/button.

function ph(event, props) { if (typeof posthog === 'undefined' || !posthog.capture) return; try { posthog.capture(event, props, { send_instantly: true }); } catch (e) {} }

// Strip a leading /es locale segment so page typing/campaigns are locale-agnostic. function normPath(p) { return p.replace(/^/es(?=/|$)/, '') || '/'; }

function pageType(path) { var p = normPath(path); if (p === '/' || p === '') return 'home'; // Templates ride with blog: both are content-marketing surfaces / end destinations. if (/^/(blog|templates)(/|$)/.test(p)) return 'blog'; if (/^/(plans/pricing|plans/unlimited|pricing)(/|$)/.test(p)) return 'pricing'; if (/^/download(/|$)/.test(p)) return 'download'; if (/^/usecases(/|$)/.test(p)) return 'usecase'; if (/^/product(/|$)/.test(p)) return 'product'; if (/^/compare(/|$)/.test(p)) return 'compare'; if (/^/contact(/|$)/.test(p)) return 'contact'; return 'other'; }

function localeOf(path) { return /^/es(/|$)/.test(path) ? 'es' : 'en'; }

function textOf(el) { return (el.textContent || '').replace(/\s+/g, ' ').trim(); }

var LOGIN_RE = /(log\s?in|sign\s?in|iniciar\s+sesi)/i; var SIGNUP_RE = /(sign\s?up|get\s+started|start\s+for\s+free|empezar|registr|crear\s+cuenta)/i; var DOWNLOAD_RE = /(download|descargar)/i;

// Returns { type, url } for tracked CTAs, else null. Destination first (reliable), // text only as a fallback for JS-driven

Privacy Preference Center

rock.so uses a small number of cookies to keep the site working, remember your language, and understand how people use Rock so we can make it better. Privacy is important to us, so you can turn off anything that isn’t essential below. Blocking a category may affect your experience on the site.

Essential Always Active

Keep the site working and remember things like your cookie choice, which privacy rules apply where you are, and whether you’re browsing in English or Spanish.

Marketing

Help us see which campaigns and channels bring people to Rock, so we know what’s actually working and don’t waste effort on what isn’t.

Personalization

Remember preferences and choices you make on the site, so parts of it can adapt to how you use them, without starting from scratch each visit.

Analytics

Help us see which pages and features people actually use and where they get stuck, so we can make Rock better. This doesn’t identify you personally.

服务器配置

{
  "mcpServers": {
    "rock": {
      "type": "http",
      "url": "https://mcp.rock.so/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_ROCK_PAT>"
      }
    }
  }
}
推荐的 MCP Server
TraeBuild with Free GPT-4.1 & Claude 3.7. Fully MCP-Ready.
Baidu Map百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
EdgeOne Pages MCPAn MCP service designed for deploying HTML content to EdgeOne Pages and obtaining an accessible public URL.
AiimagemultistyleA Model Context Protocol (MCP) server for image generation and manipulation using fal.ai's Stable Diffusion model.
Zhipu Web SearchZhipu Web Search MCP Server is a search engine specifically designed for large models. It integrates four search engines, allowing users to flexibly compare and switch between them. Building upon the web crawling and ranking capabilities of traditional search engines, it enhances intent recognition capabilities, returning results more suitable for large model processing (such as webpage titles, URLs, summaries, site names, site icons, etc.). This helps AI applications achieve "dynamic knowledge acquisition" and "precise scenario adaptation" capabilities.
Jina AI MCP ToolsA Model Context Protocol (MCP) server that integrates with Jina AI Search Foundation APIs.
Amap Maps高德地图官方 MCP Server
DeepChatYour AI Partner on Desktop
MCP AdvisorMCP Advisor & Installation - Use the right MCP server for your needs
Playwright McpPlaywright MCP server
Howtocook Mcp基于Anduin2017 / HowToCook (程序员在家做饭指南)的mcp server,帮你推荐菜谱、规划膳食,解决“今天吃什么“的世纪难题; Based on Anduin2017/HowToCook (Programmer's Guide to Cooking at Home), MCP Server helps you recommend recipes, plan meals, and solve the century old problem of "what to eat today"
RedisA Model Context Protocol server that provides access to Redis databases. This server enables LLMs to interact with Redis key-value stores through a set of standardized tools.
Y GuiA web-based graphical interface for AI chat interactions with support for multiple AI models and MCP (Model Context Protocol) servers.
BlenderBlenderMCP connects Blender to Claude AI through the Model Context Protocol (MCP), allowing Claude to directly interact with and control Blender. This integration enables prompt assisted 3D modeling, scene creation, and manipulation.
WindsurfThe new purpose-built IDE to harness magic
Tavily Mcp
Serper MCP ServerA Serper MCP Server
MiniMax MCPOfficial MiniMax Model Context Protocol (MCP) server that enables interaction with powerful Text to Speech, image generation and video generation APIs.
Visual Studio Code - Open Source ("Code - OSS")Visual Studio Code
ChatWiseThe second fastest AI chatbot™
CursorThe AI Code Editor