MCP server for the Kooperativa API — enrich and search professional profiles and companies, track hiring signals and job changes, and manage webhook monitors, directly from your AI assistant.
Strong tool definitions with comprehensive descriptions and well-structured schemas. All 8 tools have clear, LLM-optimized descriptions (100-300 chars) explaining WHAT, WHEN, and WHY. Input schemas use Zod with proper types and descriptions. kooperativa_search_people demonstrates excellent parameter design with 20+ filters, enums for seniority, and clear constraints (max 50 per_page). Error handling via withErrorHandling wrapper converts API errors to actionable MCP responses. Main gaps: no output schemas documented, no tool annotations (readOnlyHint), and some parameter descriptions could be more prescriptive about constraints (e.g., exact format for linkedin_url). Batch tool (kooperativa_bulk_enrich_people) shows good composition pattern. Naming is consistent (verb_noun: enrich, search, check, list) and unambiguous.
Get the authenticated Kooperativa account's email, license status (active/plan/expiry), and API usage this month/today, broken down by endpoint. Call this first if you're unsure whether the license is active before running a large batch job.
Enrich up to 100 profiles in a single call. Pass an array where each item has exactly one of id, username, or linkedin_url. Unmatched identifiers are silently skipped and counted in not_found.
Cheaply check whether Kooperativa already holds a given profile, without fetching the full record. Returns the matched id, full_name, and fetched_at on success, or 404 if not indexed yet. Use this to filter a list before calling enrich_person on each one.
Look up a person's full professional profile (work history, education, skills, certifications, honors, publications, volunteering) from the Kooperativa data lake. Provide exactly one of linkedin_url, username, or id. Free: included in the workspace license with no per-call charge. Returns 404 if the profile hasn't been indexed yet, in which case kooperativa_enrich_person_realtime can fetch it from the live source for $0.001.
Output schemas not documented. LLMs cannot plan downstream tool calls or extract fields without knowing response structure. kooperativa_enrich_person, kooperativa_search_people, and kooperativa_bulk_enrich_people return complex nested objects (work history, education, skills) but no schema is visible in tool registration.
No tool annotations (readOnlyHint, idempotentHint). All 8 tools are READ_ONLY and safe to retry, but this is not declared in the MCP schema. Agents cannot distinguish safe tools from destructive ones without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Fetch a person's profile from the live source instead of the Kooperativa data lake, so the answer reflects the profile as it is right now. COSTS $0.001 PER CALL, charged on top of the license, and every call is billed even when the profile is not found, because the lookup still happened. Prefer kooperativa_enrich_person, which is free and about 4x faster, and only use this one when that returned 404 or when its fetched_at is too old for the task. Provide exactly one of linkedin_url or username; there is no id parameter, because an internal id means nothing to a source that has never seen our data lake. The result is written back to the data lake, so a later kooperativa_enrich_person for the same person returns it for free. There is no cache in front of this tool: calling it twice for the same person bills twice, so do not loop over a list with it unless the spend is intended.
Simple liveness probe for the Kooperativa API. No authentication required. Use to verify connectivity before running a batch job.
List a person's current colleagues (everyone else working at their current company right now). Useful for mapping org structure or finding an alternate contact at a target account. Requires the Kooperativa profile id (from enrich_person or search_people).
Search the Kooperativa data lake of professional profiles using any combination of filters (title, company, location, industry, seniority, headcount, skills, tenure, recent job change, past employer, education). Filters combine with AND logic. Returns lightweight profile previews with pagination; pass a result's id to kooperativa_enrich_person for the full record.
Parameter descriptions lack prescriptive constraints. kooperativa_search_people accepts 'location' as string|array but description does not specify exact format (ISO 2-letter codes only, no full country names). linkedin_url parameters lack format guidance (must be https://www.linkedin.com/in/... pattern). Agents may pass invalid values.
No pagination guidance in kooperativa_person_colleagues. Tool accepts 'page' parameter but description does not state default page size, max results per page, or total count in response. Agents cannot plan pagination without this metadata.
Error messages from withErrorHandling wrapper are generic. When kooperativa_enrich_person returns 404, the error says 'Kooperativa API error (404)' but does not guide the agent to call kooperativa_enrich_person_realtime. Descriptions mention this fallback, but error responses do not.