elc-partnership-builder

Build and price an ELC community partnership: match, customize, 12-month plan, 16% AI discount.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
85%
Naming quality
88%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domainin get_partnership_options

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,832Tokens (tool definitions)
~2.2 KBTypical response size
Significant attention impact (2.99% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "elc-partnership-builder": {
      "url": "https://www.engineeringleaders.io/mcp/partnership"
    }
  }
}

Remote endpoints

https://www.engineeringleaders.io/mcp/partnershipstreamable-http

What it can do

Tool inventory

Tools (12)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢get_started(context)

Call this for a greeting (hi, hello), a connectivity/liveness test, 'what can you do', or any message too general to match a specific tool below. Returns the full menu of real questions this server answers, each mapped to the tool name that answers it. For a company actually considering ELC membership, skip straight to get_partnership_options instead.

Input Schema

{
  "type": "object",
  "properties": {
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_more_tools(context)

Check for additional tools whenever your task might benefit from specialized capabilities, even if existing tools could work as a fallback. Also the right tool for a bare greeting (hi, hello), a connectivity/liveness test, or any message too general to match a specific tool below — pass it as `context`, or send no arguments at all, and this returns the full menu instead of a dead end.

Input Schema

{
  "type": "object",
  "properties": {
    "context": {
      "description": "A description of your goal and what kind of tool would help accomplish it, OR a plain greeting/liveness ping like 'hi' or 'test'. Omit it for the menu.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_reach_options(context)

START HERE when a company wants ONE thing once, not a year-long membership: a classified (30 words and a link, tools and events only) or a dedicated send in the Leaders' Brief newsletter, a meetup hosted in their office, a speaker slot or the coached speaker programme, a conference main-stage talk, a podcast episode, a decision-maker dinner, a community survey, a job board listing. Returns every one-off with its price, lead time, examples and real reach figures, the combo discount rule, the 90-day credit against a membership, and what is not for sale. Two or more things across a year is a membership conversation: hand over to get_partnership_options. Next: quote_reach_combo once items are picked.

Input Schema

{
  "type": "object",
  "properties": {
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢quote_reach_combo(oneoff_ids, speaker_rungs, context)

Pass the one-off ids the visitor picked; returns each item's price, the list total, the combo discount by item count (job board listings never count), and the final total. For the speaker programme pass speaker_rungs to price a subset of the ladder (Stage always included); omit it for the full programme at the bundle price. This is the only arithmetic that counts — never add prices yourself. The AI-channel percentage does not apply to one-offs. Next: book_intro_call to lock the date, or get_partnership_options if the basket is starting to look like a year.

Input Schema

{
  "type": "object",
  "properties": {
    "oneoff_ids": {
      "description": "Required. One-off ids from get_reach_options One or more of: meetup-hosted, speaker-development, conference-main-stage, newsletter-dedicated, newsletter-classified, dinner, podcast-episode, survey, job-listing.",
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "string"
        }
      ]
    },
    "speaker_rungs": {
      "description": "Speaker programme rung ids (stage, story, coach, amplify, beyond) to price instead of the full programme; stage is always included",
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "string"
        }
      ]
    },
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_partnership_options(context)

START HERE for any company considering an ELC membership (personas: HR, CTO, employer branding). Returns how company membership works, real community reach figures, and the two qualifying questions with their valid answers. Companies only — individuals seeking a mentor for themselves get pointed to /mentor/ instead. After the visitor answers both questions, call match_package. Partner packages and tickets for the ELC Conference 2027 day are a separate offer with their own MCP server: https://mcp.elc-conference.io/mcp

Input Schema

{
  "type": "object",
  "properties": {
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢match_package(goal, budget, context)

Resolves goal + budget through ELC's own routing matrix — the same one the website uses — and returns the matched package(s) with real prices and their default line items. Map free-text answers to the closest valid id; on bad input the error lists the valid ids, re-ask rather than guessing. Next: customize_package to toggle line items, or request_offer to send it as-is.

Input Schema

{
  "type": "object",
  "properties": {
    "goal": {
      "description": "Required. One of the goal ids from get_partnership_options question_1",
      "type": "string"
    },
    "budget": {
      "description": "Required. One of the budget ids from get_partnership_options question_2",
      "type": "string"
    },
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢customize_package(preset_id, item_ids, seats, context)

The conversational toggle board. Pass the preset and the item ids currently ON; returns the recomputed total (never trust your own arithmetic — this is the authoritative price), every selected item with its price, and what else this tier could add. Items marked foundation anchor the package; advise keeping them. Call again after every change the visitor asks for. Next: request_offer.

Input Schema

{
  "type": "object",
  "properties": {
    "preset_id": {
      "description": "Required. The package being customized One of: free, team-seats, starter, pilot-meetup, hiring-meetup, intro-sprint, launch-audit, community-launch, launch-run, hiring, education, vital, visibility, story, product.",
      "type": "string"
    },
    "item_ids": {
      "description": "Required. Item ids currently toggled ON (from match_package default_item_ids, plus/minus changes)",
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "string"
        }
      ]
    },
    "seats": {
      "description": "Seat-priced packages only (Team Seats `team-seats`, Team Circle `starter`): how many people they are enrolling. Both are priced per seat, so ALWAYS ask for a headcount before quoting — the bundle price is only the minimum-seat entry (Team Seats 5, Team Circle 3).",
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "string"
        }
      ]
    },
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢book_intro_call(preset_id, item_ids, context)

The second legitimate ending besides request_offer: a direct booking link for a 1:1 intro meeting with Marian Kamenistak, ELC's founder. Offer it whenever the visitor hesitates, wants a human, or the package needs tailoring beyond the catalog. No contact details collected here — the booking page handles everything. Pass preset_id and item_ids if a package was composed: the response then carries a paste-ready booking note, so the call starts from their numbers instead of from scratch.

Input Schema

{
  "type": "object",
  "properties": {
    "preset_id": {
      "description": "Optional: the package composed so far, if any One of: free, team-seats, starter, pilot-meetup, hiring-meetup, intro-sprint, launch-audit, community-launch, launch-run, hiring, education, vital, visibility, story, product.",
      "type": "string"
    },
    "item_ids": {
      "description": "Optional: the basket composed so far, if any",
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "string"
        }
      ]
    },
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢fit_to_budget(preset_id, budget, must_have, against, context)

Use when the visitor names a NUMBER rather than a band — 'we have 8,000 approved', 'can we do this for five thousand'. Returns a deterministic best-value composition under that ceiling: what fits, what was left out AND why, how much budget is unspent, and what the cheapest excluded item costs. Foundation items are kept first, then the remaining items cheapest-first so the budget buys as much as possible. Priced against the AI-channel figure by default, since that is what they would actually pay. Never hand-pick a basket yourself when a budget is stated — this tool is the authoritative composition, the same way customize_package is the authoritative total.

Input Schema

{
  "type": "object",
  "properties": {
    "preset_id": {
      "description": "Required. The package to trim to budget (from match_package) One of: free, team-seats, starter, pilot-meetup, hiring-meetup, intro-sprint, launch-audit, community-launch, launch-run, hiring, education, vital, visibility, story, product.",
      "type": "string"
    },
    "budget": {
      "description": "Required. The visitor's ceiling in EUR, as a number (8000, not '8K')",
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "string"
        }
      ]
    },
    "must_have": {
      "description": "Optional: item ids the visitor explicitly asked for; kept first if they fit",
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "string"
        }
      ]
    },
    "against": {
      "description": "Price the budget against the list price. 'discounted' equals list since the AI channel carries no discount (2026-10-05) One of: discounted, list.",
      "type": "string"
    },
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢build_business_case(preset_id, item_ids, company, requester_name, open_senior_roles, ...)

Turns a composed basket into the argument that gets it approved: recruiter-fee equivalence, break-even hire count, cost per room, cost per month, what the spend replaces, and every assumption behind those numbers. Also returns `approval_memo` — plain text the visitor can forward to whoever holds the budget, unedited. Use it whenever money, ROI, justification or 'I need to convince my CFO/CTO' comes up, and offer it unprompted before request_offer: the person in this conversation usually is not the person who approves the spend. Never compute this arithmetic yourself — like pricing, the server is authoritative. It compares costs and states break-even; it never forecasts hires, and neither should you.

Input Schema

{
  "type": "object",
  "properties": {
    "preset_id": {
      "description": "Required. The package being justified One of: free, team-seats, starter, pilot-meetup, hiring-meetup, intro-sprint, launch-audit, community-launch, launch-run, hiring, education, vital, visibility, story, product.",
      "type": "string"
    },
    "item_ids": {
      "description": "Required. The basket: item ids toggled ON",
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "string"
        }
      ]
    },
    "company": {
      "description": "Optional: company name, for the memo",
      "type": "string"
    },
    "requester_name": {
      "description": "Optional: who is asking for approval, signed at the memo's foot",
      "type": "string"
    },
    "open_senior_roles": {
      "description": "Optional: senior roles they need to fill in 12 months — sharpens the comparison into their numbers",
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "string"
        }
      ]
    },
    "avg_first_year_salary": {
      "description": "Optional: average first-year salary in EUR for those roles; turns the generic fee band into their own",
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "string"
        }
      ]
    },
    "kpis": {
      "description": "Optional: what has to move this year, in their words",
      "type": "string"
    },
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢design_journey(preset_id, item_ids, start_month, context)

The moment the package becomes a year: deterministic month-by-month plan of what lands when, computed from the basket's own scheduling metadata (lead times, anchors like the April 2027 conference, spacing, and heavy-event collision rules). Returns placed months, the recurring-every-month layer, and anything unplaceable WITH its reason. The plan contains ONLY items in the basket — narrate around it, never add or move an event. Call after customize_package, before request_offer.

Input Schema

{
  "type": "object",
  "properties": {
    "preset_id": {
      "description": "Required. One of: free, team-seats, starter, pilot-meetup, hiring-meetup, intro-sprint, launch-audit, community-launch, launch-run, hiring, education, vital, visibility, story, product.",
      "type": "string"
    },
    "item_ids": {
      "description": "Required. The basket: item ids toggled ON",
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "string"
        }
      ]
    },
    "start_month": {
      "description": "Required. First membership month, YYYY-MM (ask the visitor; default to the month after the current one)",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$"
    },
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡request_offer(name, email, company, kpis, visibility_interest, ...)

The ONLY tool that collects contact details. Sends the itemized offer to the visitor's email, notifies Marian (email + Slack), and files the company into ELC's partners queue. Ask for name, work email and company only when the visitor says they want the offer — never earlier. After success: share the confirmation, then make ONE optional ask: would they post publicly (LinkedIn/X) about building their membership with AI? Optional means optional — the discount is already theirs.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "description": "Required. Visitor's full name",
      "type": "string"
    },
    "email": {
      "description": "Required. Work email the offer goes to",
      "type": "string"
    },
    "company": {
      "description": "Required. Company name",
      "type": "string"
    },
    "kpis": {
      "description": "Optional: what they need to move this year, in their words",
      "type": "string"
    },
    "visibility_interest": {
      "description": "From the discovery question: do they want to invest in their visibility through the cooperation — as a company, through individual leaders, or stay quiet? One of: company, individual, quiet, undecided.",
      "type": "string"
    },
    "final_price_confirmed": {
      "description": "Required. REQUIRED TRUE: set only after the visitor has seen and explicitly confirmed the exact final total . Sending without this confirmation is refused.",
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "string"
        }
      ]
    },
    "preset_id": {
      "description": "Required. One of: free, team-seats, starter, pilot-meetup, hiring-meetup, intro-sprint, launch-audit, community-launch, launch-run, hiring, education, vital, visibility, story, product.",
      "type": "string"
    },
    "item_ids": {
      "description": "Required. The final basket: item ids toggled ON",
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "string"
        }
      ]
    },
    "context": {
      "description": "Optional. A short description of your goal and why you are calling this tool. Recorded as intent so the tools can be improved; it never changes the answer.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded12 tools
verifiedversion not recorded12 tools
verifiedversion not recorded12 tools
verifiedversion not recorded12 tools
verifiedversion not recorded12 tools
verifiedversion not recorded12 tools