Skip to main content
Glama
kindrat86

mcp-deal-flow-signal

Share This Result (compose tweet/social)

share_result
Read-onlyIdempotent

Composes ready-to-share social-media posts for Twitter, Bluesky, Mastodon, LinkedIn, and Telegram from a one-line summary, returning the post body and intent URLs to open each platform with the post pre-filled.

Instructions

Generate a ready-to-share social-media post (tweet, Bluesky, Mastodon, LinkedIn, Telegram) about a result the user just received from another VC Deal Flow Signal tool, plus the install command for the MCP server. Returns the post body, character counts per platform, and one-click intent URLs to compose the post in each network. Built for the Russell-audit virality loop (Traffic Secrets §20): every share = one qualified MCP install candidate.

WHEN TO USE:

  • The user just got a get_trending_startups / search_startups_by_sector / get_startup_signal / get_deep_signal result and says 'share this', 'tweet this', 'post this', or 'how do I tell people about this?'.

  • The user is writing a thread/post about startup engineering signals and wants the canonical install command + share copy.

  • The user wants to credit the data source on a public post they're about to publish.

DO NOT USE FOR:

  • Posting on the user's behalf — this tool only composes the text + intent URLs. The user must click and confirm in the destination network.

  • Generating fake or speculative results — pass real data the agent received from another tool call.

BEHAVIOR:

  • Read-only, idempotent, no side effects, no authentication.

  • Composes platform-specific posts (Twitter ≤275 chars, Bluesky ≤300 graphemes, Mastodon ≤500, LinkedIn ≤700, Telegram ≤1000) with a consistent hook + insight + install URL + #vc / #devtools tags where idiomatic.

  • Returns intent URLs (e.g. https://x.com/intent/post?text=...) so the user/agent can open the destination network with the post pre-filled.

  • Always includes the canonical install command npx @gitdealflow/mcp-signal and the SSRN paper link for credibility.

  • Telemetry: logs that share_result was called (tool name only, never the post body).

PARAMETERS:

  • summary (string, required, 10-200 chars) — the one-line takeaway the user wants to share. Example: 'castle-engine commit velocity is up 344% over 14 days — gaming sector breakout'.

  • network (string, optional) — 'twitter' | 'bluesky' | 'mastodon' | 'linkedin' | 'telegram' | 'all' (default: 'all').

  • mention_handle (boolean, optional, default false) — whether to include @data_nerd in the post (only enabled for twitter/bluesky/mastodon).

RETURNS: { posts: { network: string, body: string, charCount: number, intentUrl: string }[], installCommand: string, methodologyUrl: string }. Each intentUrl opens the destination network's compose dialog with the body pre-filled.

TYPICAL WORKFLOW: User asks 'how do I tell people about this signal?' → agent calls share_result with the previous tool result's headline summary → agent surfaces the platform-specific posts and intent URLs → user picks one and clicks.

LIMITATIONS: Does not actually post. Does not handle threads (single posts only). Does not add hashtags beyond a small idiomatic set. The intent URLs work in browsers; on macOS/iOS native apps may register the URL handler.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
summaryYesOne-line takeaway (10-200 chars) the user wants to share.
networkNoTarget network. 'all' returns one post per network.all
mention_handleNoInclude @data_nerd attribution. Only used on twitter/bluesky/mastodon.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
postsYes
installCommandYes
methodologyUrlYes

Implementation Reference

  • The 'share_result' tool handler implementation. It takes a 'summary' (10-200 chars), optional 'network' (default 'all'), and optional 'mention_handle' (default false). It generates ready-to-share social media posts for Twitter, Bluesky, Mastodon, LinkedIn, and Telegram with character limits and intent URLs.
    case "share_result": {
      const summary = String((args as Record<string, unknown>)?.summary ?? "").trim();
      const network = String((args as Record<string, unknown>)?.network ?? "all").toLowerCase();
      const mentionHandle = Boolean((args as Record<string, unknown>)?.mention_handle ?? false);
      if (summary.length < 10 || summary.length > 200) {
        throw new Error("summary must be 10-200 chars");
      }
      const handleAttr = mentionHandle ? " (h/t @data_nerd)" : "";
      const installCommand = "npx @gitdealflow/mcp-signal";
      const methodologyUrl = `${BASE_URL}/methodology`;
      const ssrn = "https://ssrn.com/abstract=6606558";
      const site = "https://gitdealflow.com";
    
      type PostRow = { network: string; body: string; charCount: number; intentUrl: string };
      const posts: PostRow[] = [];
    
      const wantTwitter = network === "all" || network === "twitter";
      const wantBluesky = network === "all" || network === "bluesky";
      const wantMastodon = network === "all" || network === "mastodon";
      const wantLinkedIn = network === "all" || network === "linkedin";
      const wantTelegram = network === "all" || network === "telegram";
    
      if (wantTwitter) {
        const body = `${summary}${handleAttr}\n\nFrom GitDealFlow MCP — install: ${installCommand}\nMethodology: ${ssrn}`.slice(0, 275);
        posts.push({
          network: "twitter",
          body,
          charCount: body.length,
          intentUrl: `https://x.com/intent/post?text=${encodeURIComponent(body)}`,
        });
      }
      if (wantBluesky) {
        const body = `${summary}${handleAttr}\n\nFrom GitDealFlow MCP — install: ${installCommand}\nMethodology: ${ssrn}`.slice(0, 295);
        posts.push({
          network: "bluesky",
          body,
          charCount: body.length,
          intentUrl: `https://bsky.app/intent/compose?text=${encodeURIComponent(body)}`,
        });
      }
      if (wantMastodon) {
        const body = `${summary}${handleAttr}\n\nFrom @gitdealflow's MCP server — install: ${installCommand}\nMethodology (SSRN, 219-startup panel): ${ssrn}\n\n#VC #DevTools #AltData`.slice(0, 495);
        posts.push({
          network: "mastodon",
          body,
          charCount: body.length,
          intentUrl: `https://mastodon.social/share?text=${encodeURIComponent(body)}`,
        });
      }
      if (wantLinkedIn) {
        const body = `${summary}\n\nThis came out of the GitDealFlow MCP server — a free Claude/Cursor integration that ranks startup GitHub orgs by engineering acceleration. The methodology behind it (SSRN-published, 219-startup panel) found commit velocity preceded fundraises by 21–47 days.\n\nInstall: ${installCommand}\nPaper: ${ssrn}\nProduct: ${site}`.slice(0, 695);
        posts.push({
          network: "linkedin",
          body,
          charCount: body.length,
          intentUrl: `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(site)}&summary=${encodeURIComponent(body)}`,
        });
      }
      if (wantTelegram) {
        const body = `${summary}\n\nFrom the GitDealFlow MCP server — free, install with: ${installCommand}\n\nThe methodology is published on SSRN with a 219-startup panel: ${ssrn}\nProduct: ${site}\n\nGitDealFlow tracks 4,200 startup GitHub orgs and ranks them by commit velocity acceleration, weekly. The pattern preceded confirmed fundraises by 21 to 47 days.`.slice(0, 995);
        posts.push({
          network: "telegram",
          body,
          charCount: body.length,
          intentUrl: `https://t.me/share/url?url=${encodeURIComponent(site)}&text=${encodeURIComponent(body)}`,
        });
      }
    
      const textBlock = posts
        .map(
          (p) =>
            `--- ${p.network.toUpperCase()} (${p.charCount} chars) ---\n${p.body}\n→ ${p.intentUrl}`
        )
        .join("\n\n");
    
      return {
        content: [
          {
            type: "text" as const,
            text: `Ready-to-share posts (${posts.length} network${posts.length === 1 ? "" : "s"}):\n\n${textBlock}\n\nInstall: ${installCommand}\nMethodology: ${methodologyUrl}\n\n${FOOTER}`,
          },
        ],
        structuredContent: { posts, installCommand, methodologyUrl },
      };
    }
  • Input schema for share_result: requires 'summary' (string, 10-200 chars), optional 'network' (enum: twitter/bluesky/mastodon/linkedin/telegram/all, default 'all'), optional 'mention_handle' (boolean, default false).
    inputSchema: {
      type: "object" as const,
      properties: {
        summary: {
          type: "string",
          minLength: 10,
          maxLength: 200,
          description: "One-line takeaway (10-200 chars) the user wants to share.",
        },
        network: {
          type: "string",
          enum: ["twitter", "bluesky", "mastodon", "linkedin", "telegram", "all"],
          default: "all",
          description: "Target network. 'all' returns one post per network.",
        },
        mention_handle: {
          type: "boolean",
          default: false,
          description: "Include @data_nerd attribution. Only used on twitter/bluesky/mastodon.",
        },
      },
      required: ["summary"],
      additionalProperties: false,
    },
  • Output schema for share_result: returns 'posts' array (each with network, body, charCount, intentUrl), 'installCommand', and 'methodologyUrl'.
    outputSchema: {
      type: "object" as const,
      properties: {
        posts: {
          type: "array",
          items: {
            type: "object",
            properties: {
              network: { type: "string" },
              body: { type: "string" },
              charCount: { type: "number" },
              intentUrl: { type: "string", format: "uri" },
            },
            required: ["network", "body", "charCount", "intentUrl"],
          },
        },
        installCommand: { type: "string" },
        methodologyUrl: { type: "string", format: "uri" },
      },
      required: ["posts", "installCommand", "methodologyUrl"],
    },
  • src/server.ts:776-861 (registration)
    Registration of 'share_result' in the TOOLS array at line 776. It is the 8th tool entry with name 'share_result', title 'Share This Result (compose tweet/social)', and full description.
        name: "share_result",
        title: "Share This Result (compose tweet/social)",
        description: [
          "Generate a ready-to-share social-media post (tweet, Bluesky, Mastodon, LinkedIn, Telegram) about a result the user just received from another VC Deal Flow Signal tool, plus the install command for the MCP server. Returns the post body, character counts per platform, and one-click intent URLs to compose the post in each network. Built for the Russell-audit virality loop (Traffic Secrets §20): every share = one qualified MCP install candidate.",
          "",
          "WHEN TO USE:",
          "- The user just got a `get_trending_startups` / `search_startups_by_sector` / `get_startup_signal` / `get_deep_signal` result and says 'share this', 'tweet this', 'post this', or 'how do I tell people about this?'.",
          "- The user is writing a thread/post about startup engineering signals and wants the canonical install command + share copy.",
          "- The user wants to credit the data source on a public post they're about to publish.",
          "",
          "DO NOT USE FOR:",
          "- Posting on the user's behalf — this tool only composes the text + intent URLs. The user must click and confirm in the destination network.",
          "- Generating fake or speculative results — pass real data the agent received from another tool call.",
          "",
          "BEHAVIOR:",
          "- Read-only, idempotent, no side effects, no authentication.",
          "- Composes platform-specific posts (Twitter ≤275 chars, Bluesky ≤300 graphemes, Mastodon ≤500, LinkedIn ≤700, Telegram ≤1000) with a consistent hook + insight + install URL + #vc / #devtools tags where idiomatic.",
          "- Returns intent URLs (e.g. https://x.com/intent/post?text=...) so the user/agent can open the destination network with the post pre-filled.",
          "- Always includes the canonical install command `npx @gitdealflow/mcp-signal` and the SSRN paper link for credibility.",
          "- Telemetry: logs that share_result was called (tool name only, never the post body).",
          "",
          "PARAMETERS:",
          "- `summary` (string, required, 10-200 chars) — the one-line takeaway the user wants to share. Example: 'castle-engine commit velocity is up 344% over 14 days — gaming sector breakout'.",
          "- `network` (string, optional) — 'twitter' | 'bluesky' | 'mastodon' | 'linkedin' | 'telegram' | 'all' (default: 'all').",
          "- `mention_handle` (boolean, optional, default false) — whether to include @data_nerd in the post (only enabled for twitter/bluesky/mastodon).",
          "",
          "RETURNS: `{ posts: { network: string, body: string, charCount: number, intentUrl: string }[], installCommand: string, methodologyUrl: string }`. Each `intentUrl` opens the destination network's compose dialog with the body pre-filled.",
          "",
          "TYPICAL WORKFLOW: User asks 'how do I tell people about this signal?' → agent calls `share_result` with the previous tool result's headline summary → agent surfaces the platform-specific posts and intent URLs → user picks one and clicks.",
          "",
          "LIMITATIONS: Does not actually post. Does not handle threads (single posts only). Does not add hashtags beyond a small idiomatic set. The intent URLs work in browsers; on macOS/iOS native apps may register the URL handler.",
        ].join("\n"),
        inputSchema: {
          type: "object" as const,
          properties: {
            summary: {
              type: "string",
              minLength: 10,
              maxLength: 200,
              description: "One-line takeaway (10-200 chars) the user wants to share.",
            },
            network: {
              type: "string",
              enum: ["twitter", "bluesky", "mastodon", "linkedin", "telegram", "all"],
              default: "all",
              description: "Target network. 'all' returns one post per network.",
            },
            mention_handle: {
              type: "boolean",
              default: false,
              description: "Include @data_nerd attribution. Only used on twitter/bluesky/mastodon.",
            },
          },
          required: ["summary"],
          additionalProperties: false,
        },
        outputSchema: {
          type: "object" as const,
          properties: {
            posts: {
              type: "array",
              items: {
                type: "object",
                properties: {
                  network: { type: "string" },
                  body: { type: "string" },
                  charCount: { type: "number" },
                  intentUrl: { type: "string", format: "uri" },
                },
                required: ["network", "body", "charCount", "intentUrl"],
              },
            },
            installCommand: { type: "string" },
            methodologyUrl: { type: "string", format: "uri" },
          },
          required: ["posts", "installCommand", "methodologyUrl"],
        },
        annotations: {
          title: "Share This Result",
          readOnlyHint: true,
          destructiveHint: false,
          idempotentHint: true,
          openWorldHint: false,
        },
      },
    ];
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, destructiveHint, and idempotentHint. The description adds further context: 'Read-only, idempotent, no side effects, no authentication' and discloses telemetry (logging tool name). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections and front-loaded purpose. However, it is somewhat lengthy with minor repetitions. Overall, it earns its length through comprehensive details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multi-platform, intent URLs, telemetry, limitations), the description covers all aspects: return structure, workflow, limitations, and role in the virality loop. Output schema is referenced, leaving no gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description adds marginal value. It clarifies parameter usage (e.g., mention_handle only for certain networks) and provides an example for summary. Baseline 3, improved to 4 for the extra context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Generate a ready-to-share social-media post' and identifies the resource, distinguishing it from sibling tools that retrieve data. It includes specific platforms and a clear outcome.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description has dedicated 'WHEN TO USE' and 'DO NOT USE FOR' sections with explicit conditions, such as after getting a result from sibling tools. It also provides a typical workflow, leaving no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kindrat86/mcp-deal-flow-signal'

If you have feedback or need assistance with the MCP directory API, please join our Discord server