Skip to main content
Glama
getgapup

@gapup/mcp-knowledge

by getgapup

partnership_synergies

Read-onlyIdempotent

Identify and rank strategic partnership opportunities for your company. Get scored targets with revenue lift, time-to-impact, integration complexity, and regulatory risk, plus a first-step outreach playbook.

Instructions

Identify and rank strategic partnership opportunities for a company. Returns 5-12 high-fit partnership targets, each scored on revenue lift, time-to-impact, integration complexity and regulatory risk, with a rationale and a recommended first-step outreach playbook. When to use this tool: the user wants business-development or alliance ideas, or M&A target screening before deeper due diligence. Inputs: the user's own company and the strategic axis to unlock through partnership (e.g. enter a new market via distribution, add AI infrastructure without rebuilding). Delivered by Antoine, the AI CSO of the Gapup portfolio.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
selfCompanyYes
strategicAxisYesWhat strategic axis to unlock through partnership (e.g. 'enter US market via distribution', 'leverage AI infra without rebuild')
constraintsNo
currentPartnershipsNoExisting alliances to factor in
focusNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
executiveSummaryYesBoard-ready partnership opportunity overview
partnershipTargetsYes5-12 ranked partnership targets
kpisNo3-5 headline KPI bubbles
recommendationsNoPrioritised next steps
sourcesNo

Implementation Reference

  • The handler function that executes the partnership_synergies tool logic by calling the Gapup API endpoint 'partnership-synergies' with the input and optional AbortSignal.
    export async function handle(input: unknown, signal?: AbortSignal): Promise<unknown> {
      return callGapupEndpoint("partnership-synergies", input, signal);
    }
  • The full tool definition including name ('partnership_synergies'), description, inputSchema (selfCompany, strategicAxis, constraints, currentPartnerships, focus), outputSchema, and annotations.
    export const tool = {
      name: "partnership_synergies",
      description:
        "Identify and rank strategic partnership opportunities for a company. Returns 5-12 high-fit partnership targets, each scored on revenue lift, time-to-impact, integration complexity and regulatory risk, with a rationale and a recommended first-step outreach playbook. When to use this tool: the user wants business-development or alliance ideas, or M&A target screening before deeper due diligence. Inputs: the user's own company and the strategic axis to unlock through partnership (e.g. enter a new market via distribution, add AI infrastructure without rebuilding). Delivered by Antoine, the AI CSO of the Gapup portfolio.",
      inputSchema: {
        type: "object",
        properties: {
          selfCompany: {
            type: "object",
            properties: {
              name: { type: "string", minLength: 2, maxLength: 120 },
              url: { type: "string", format: "uri" },
              pitch: { type: "string", minLength: 10, maxLength: 600 },
              stage: {
                type: "string",
                enum: ["pre-seed", "seed", "series-a", "series-b", "series-c", "growth", "public"],
              },
              arrEur: { type: "number", minimum: 0 },
            },
            required: ["name", "pitch"],
          },
          strategicAxis: {
            type: "string",
            minLength: 20,
            maxLength: 800,
            description: "What strategic axis to unlock through partnership (e.g. 'enter US market via distribution', 'leverage AI infra without rebuild')",
          },
          constraints: {
            type: "object",
            properties: {
              budgetCeilingEur: { type: "number", minimum: 0 },
              timeWindow: { type: "string", enum: ["3mo", "6mo", "12mo", "24mo"] },
              regulatoryHotZones: { type: "array", items: { type: "string" } },
              mustNotCompeteWith: { type: "array", items: { type: "string" } },
            },
          },
          currentPartnerships: {
            type: "array",
            items: { type: "string" },
            maxItems: 20,
            description: "Existing alliances to factor in",
          },
          focus: {
            type: "string",
            maxLength: 800,
          },
        },
        required: ["selfCompany", "strategicAxis"],
      },
      outputSchema: {
        type: "object",
        properties: {
          executiveSummary: {
            type: "string",
            description: "Board-ready partnership opportunity overview",
          },
          partnershipTargets: {
            type: "array",
            description: "5-12 ranked partnership targets",
            items: {
              type: "object",
              properties: {
                rank: { type: "integer" },
                partnerName: { type: "string" },
                partnerUrl: { type: "string" },
                partnershipType: { type: "string", description: "e.g. distribution, technology, co-marketing, OEM, M&A" },
                revenueLiftScore: { type: "number", minimum: 0, maximum: 10 },
                timeToImpact: { type: "string", enum: ["3mo", "6mo", "12mo", "24mo"] },
                integrationComplexity: { type: "string", enum: ["low", "medium", "high"] },
                regulatoryRisk: { type: "string", enum: ["low", "medium", "high"] },
                rationale: { type: "string" },
                outreachPlaybook: {
                  type: "object",
                  properties: {
                    firstStep: { type: "string" },
                    keyContact: { type: "string" },
                    openingAngle: { type: "string" },
                  },
                  required: ["firstStep", "openingAngle"],
                },
              },
              required: ["rank", "partnerName", "partnershipType", "revenueLiftScore", "rationale"],
            },
          },
          kpis: {
            type: "array",
            description: "3-5 headline KPI bubbles",
            items: {
              type: "object",
              properties: {
                label: { type: "string" },
                value: { type: "string" },
                trend: { type: "string", enum: ["up", "down", "stable"] },
              },
              required: ["label", "value"],
            },
          },
          recommendations: {
            type: "array",
            description: "Prioritised next steps",
            items: {
              type: "object",
              properties: {
                action: { type: "string" },
                horizon: { type: "string" },
                expectedImpact: { type: "string" },
              },
              required: ["action", "horizon"],
            },
          },
          sources: {
            type: "array",
            items: {
              type: "object",
              properties: {
                url: { type: "string" },
                excerpt: { type: "string" },
              },
              required: ["url"],
            },
          },
        },
        required: ["executiveSummary", "partnershipTargets"],
      },
      annotations: {
        readOnlyHint: true,
        idempotentHint: true,
        destructiveHint: false,
        openWorldHint: true,
        title: "Strategic Partnership Synergies",
      },
    } as const;
  • The shared HTTP client helper function 'callGapupEndpoint' used by the handler to POST to the Gapup API. It handles auth, rate limiting, and error responses.
    export async function callGapupEndpoint(
      slug: string,
      input: unknown,
      signal?: AbortSignal
    ): Promise<unknown> {
      const apiKey = process.env.GAPUP_API_KEY;
      if (!apiKey) {
        throw new GapupAuthError(
          "GAPUP_API_KEY environment variable required. Get a free tier key (100 calls/mo) at https://hub.gapup.io/agents-api/onboard"
        );
      }
    
      const res = await fetch(`${HUB_BASE_URL}/api/agent/${slug}`, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "X-Api-Key": apiKey,
          "Accept": "application/json",
          "User-Agent": "@gapup/mcp-knowledge/0.1.0",
        },
        body: JSON.stringify(input),
        signal,
      });
    
      if (res.status === 401) {
        throw new GapupAuthError(
          "Invalid or missing GAPUP_API_KEY. Verify your key at https://hub.gapup.io/agents-api/onboard"
        );
      }
    
      if (res.status === 402) {
        const body = await res.text().catch(() => "");
        throw new GapupAuthError(
          `Free tier quota exhausted or paid auth required. Upgrade at https://hub.gapup.io/agents-api (received 402: ${body.slice(0, 120)})`
        );
      }
    
      if (res.status === 404) {
        throw new GapupApiError(
          404,
          `Endpoint '${slug}' not found — check GAPUP_API_BASE_URL or update the package (npm update @gapup/mcp-knowledge)`
        );
      }
    
      if (res.status === 429) {
        const retryAfter = res.headers.get("Retry-After");
        const retryMsg = retryAfter ? ` Retry after ${retryAfter} seconds.` : "";
        const body = await res.text().catch(() => "");
        throw new GapupApiError(
          429,
          `Rate limit exceeded.${retryMsg} Upgrade your plan at https://hub.gapup.io/agents-api (received: ${body.slice(0, 100)})`
        );
      }
    
      if (!res.ok) {
        const body = await res.text().catch(() => "");
        throw new GapupApiError(res.status, body);
      }
    
      return res.json();
    }
  • src/index.ts:21-42 (registration)
    The import and registration of the partnership_synergies tool in the TOOLS array, which gets exposed via the MCP ListToolsRequestSchema handler.
    import { tool as competitorIntelTool, handle as competitorIntelHandle } from "./tools/competitor-intel.js";
    import { tool as trendWatcherTool, handle as trendWatcherHandle } from "./tools/trend-watcher.js";
    import { tool as partnershipTool, handle as partnershipHandle } from "./tools/partnership-synergies.js";
    import { tool as pitchDeckTool, handle as pitchDeckHandle } from "./tools/pitch-deck-storyline.js";
    import { tool as carbonTool, handle as carbonHandle } from "./tools/carbon-footprint-calculator.js";
    
    type ToolHandle = (input: unknown, signal?: AbortSignal) => Promise<unknown>;
    type ToolDef = {
      name: string;
      description: string;
      inputSchema: object;
      outputSchema?: object;
      annotations?: object;
    };
    
    const TOOLS: Array<{ def: ToolDef; handle: ToolHandle }> = [
      { def: competitorIntelTool, handle: competitorIntelHandle },
      { def: trendWatcherTool, handle: trendWatcherHandle },
      { def: partnershipTool, handle: partnershipHandle },
      { def: pitchDeckTool, handle: pitchDeckHandle },
      { def: carbonTool, handle: carbonHandle },
    ];
Behavior4/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, etc. The description adds valuable behavioral context: the tool returns 5-12 results, scores on multiple dimensions, and includes an outreach playbook. It also mentions being delivered by a specific persona (Antoine, AI CSO). This goes beyond annotations, but the description does not discuss rate limits, auth, or side effects, which is fine given the annotations.

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

Conciseness5/5

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

The description is concise, approximately 4 sentences, with the most important information first. Every sentence adds value: purpose, output specifics, usage guidance, input explanation, and context. No redundancy or unnecessary 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 complexity (5 parameters, nested objects, and an output schema), the description covers the essential inputs (selfCompany, strategicAxis), mentions the output structure (5-12 scored targets with rationale and playbook), and provides usage context. With an output schema present, the description does not need to detail return values, making it complete for agent invocation.

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 description coverage is 40%, but the description provides additional meaning for key parameters: it explains selfCompany and strategicAxis as inputs, and describes strategicAxis with an example. However, it does not elaborate on nested fields of selfCompany (e.g., name, url, pitch) or constraints, currentPartnerships, focus. The description partially compensates for the low schema coverage.

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 it identifies and ranks strategic partnership opportunities, returning 5-12 targets with scores on revenue lift, time-to-impact, integration complexity, and regulatory risk, plus a rationale and outreach playbook. It is specific about the resource (partnership opportunities) and the verb (identify and rank), and it distinguishes itself from siblings like competitor_intel or trend_watcher.

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

Usage Guidelines4/5

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

The description includes explicit guidance: 'When to use this tool: the user wants business-development or alliance ideas, or M&A target screening before deeper due diligence.' This clearly indicates the context. However, it does not explicitly state when not to use or provide alternatives, so it's not a perfect 5.

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/getgapup/gapup-mcp'

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