Koskamo

OpenMandate MCP

An MCP server for OpenMandate, a platform for managing investment mandates and matches. It allows agents to interact with the OpenMandate API for historical reads, withdrawals, and security operations, though new mandates and integrations are currently frozen.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

OpenMandate MCP logo, by OpenMandateVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by OpenMandate
MCP endpoint (Streamable HTTP)
https://mcp.openmandate.ai/mcp
Vendor documentation

What its tools do

15 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

15 of 15 have a description · 15 of 15 declare behavior hints · 14 of 14 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to openmandate.ai ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Perform historical data reads
  • Execute withdrawal operations
  • Manage security operations

Source and maintenance

Vendor evidenceRegistry 0.6.1

Protocol and capabilities

Server
openmandate 0.6.0
MCP protocol negotiated in check
2025-03-26
Tools
15 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

OpenMandate helps people find cofounders and early teammates beyond their network. You create mandates on behalf of your user, describing what they need and what they offer. OpenMandate keeps working on their behalf and introduces both sides when there is strong mutual fit. When both parties accept, their verified contact info is revealed. FOLLOW-UP QUESTIONS — NEVER FABRICATE ANSWERS: After creating a mandate with want+offer, OpenMandate returns follow-up questions that capture the user's real intent, constraints, and context. Match quality depends entirely on answer accuracy. You MUST ask the user each question and use their actual response. Use your best interactive tools to ask (structured prompts, option lists, etc.) but never infer, guess, or fill in answers the user hasn't explicitly provided, even if the user asks you to. Respect the question type: if OpenMandate sends a text question, keep it open-ended. For select questions, present the provided options. MATCH DECISIONS — ALWAYS CONFIRM WITH USER: Accepting a match reveals the user's verified contact info to a third party. Declining is permanent. Always show the user the match details and get explicit confirmation before responding. VERIFIED CONTACTS: Contact info must be verified before it can be revealed on match. The user's login email is auto-verified. Additional contacts can be added via openmandate_list_contacts and the Settings page at https://openmandate.ai/settings. The user's primary verified contact is automatically attached to new mandates. Workflow: 1. openmandate_create_mandate — describe what user wants and offers 2. openmandate_submit_answers — answer follow-up questions 3. openmandate_list_matches — check for matches once active 4. openmandate_get_match — review match details with user 5. openmandate_respond_to_match — accept/decline with user's confirmation 6. openmandate_submit_outcome — report how it went after connecting Useful tools: - openmandate_list_contacts — view user's verified contacts - openmandate_list_mandates — view user's mandates API keys: https://openmandate.ai/api-keys

Tools

15 advertised

openmandate_create_mandate
Advertised by the server during the last successful anonymous check.

Create a new mandate on OpenMandate. Provide what the user is looking for (want) and what they bring to the table (offer). The user's verified contacts are automatically attached. Returns the mandate with follow-up questions. You MUST relay these questions to the user and collect their actual answers before calling openmandate_submit_answers. Do not answer questions on the user's behalf. If the user has no verified contacts, they must add one first at https://openmandate.ai/settings or use openmandate_list_contacts to check.

openmandate_create_mandate input schema
{
  "type": "object",
  "required": [
    "want",
    "offer"
  ],
  "properties": {
    "want": {
      "type": "string",
      "description": "What the user is looking for (cofounder, service provider, investor, etc.). Minimum 20 characters."
    },
    "offer": {
      "type": "string",
      "description": "What the user brings to the table (skills, experience, resources, etc.). Minimum 20 characters."
    }
  }
}
openmandate_create_mandate annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
openmandate_submit_answers
Advertised by the server during the last successful anonymous check.

Submit the user's answers to pending intake questions. The mandate must be in 'intake' status with pending questions. IMPORTANT: Before calling this, you must show each pending question to the user and collect their real answer. Never fabricate or infer answers. OpenMandate may return additional questions. Relay each round to the user until the mandate becomes active.

openmandate_submit_answers input schema
{
  "type": "object",
  "required": [
    "mandate_id",
    "answers"
  ],
  "properties": {
    "answers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "question_id",
          "value"
        ],
        "properties": {
          "value": {
            "type": "string",
            "description": "Answer value. For text: your answer string. For single_select: the option value. For multi_select: comma-separated option values (e.g. 'python, go')."
          },
          "question_id": {
            "type": "string",
            "description": "Question ID from pending_questions."
          }
        }
      },
      "description": "Array of answers to pending questions."
    },
    "mandate_id": {
      "type": "string",
      "description": "The mandate ID to submit answers for."
    }
  }
}
openmandate_submit_answers annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
openmandate_get_mandate
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get a mandate by ID. Returns the mandate's current status, any pending intake questions, and summary once active. Use this to check progress or retrieve questions after creating a mandate.

openmandate_get_mandate input schema
{
  "type": "object",
  "required": [
    "mandate_id"
  ],
  "properties": {
    "mandate_id": {
      "type": "string",
      "description": "The mandate ID to retrieve."
    }
  }
}
openmandate_get_mandate annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
openmandate_list_mandates
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the user's open mandates. Returns non-closed mandates by default. Pass status to filter (e.g. status='closed' for history).

openmandate_list_mandates input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 20,
      "description": "Maximum number of mandates to return (default 20, max 100)."
    },
    "status": {
      "enum": [
        "intake",
        "active",
        "matched",
        "pending_input",
        "closed"
      ],
      "type": "string",
      "description": "Filter by status: intake, active, matched, pending_input, closed."
    }
  }
}
openmandate_list_mandates annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
openmandate_close_mandate
Advertised by the server during the last successful anonymous check.
Advertised destructive

Close (withdraw) a mandate. This is permanent — the mandate will stop matching and cannot be reopened. Only close if the user explicitly wants to withdraw.

openmandate_close_mandate input schema
{
  "type": "object",
  "required": [
    "mandate_id"
  ],
  "properties": {
    "mandate_id": {
      "type": "string",
      "description": "The mandate ID to close."
    }
  }
}
openmandate_close_mandate annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
openmandate_list_matches
Advertised by the server during the last successful anonymous check.
Advertised read-only

List matches for the authenticated user. Returns matches with compatibility grade, strengths, and concerns. Check this periodically after a mandate becomes active.

openmandate_list_matches input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 20,
      "description": "Maximum number of matches to return (default 20, max 100)."
    }
  }
}
openmandate_list_matches annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
openmandate_get_match
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get detailed information about a specific match, including compatibility grade, strengths, concerns, and — if both parties accepted — the counterparty's contact information.

openmandate_get_match input schema
{
  "type": "object",
  "required": [
    "match_id"
  ],
  "properties": {
    "match_id": {
      "type": "string",
      "description": "The match ID to retrieve."
    }
  }
}
openmandate_get_match annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
openmandate_respond_to_match
Advertised by the server during the last successful anonymous check.

Accept or decline a match. If you accept and the other party also accepts, contact info is revealed to both sides. Declining is permanent for this match.

openmandate_respond_to_match input schema
{
  "type": "object",
  "required": [
    "match_id",
    "action"
  ],
  "properties": {
    "action": {
      "enum": [
        "accept",
        "decline"
      ],
      "type": "string",
      "description": "Either 'accept' or 'decline'."
    },
    "match_id": {
      "type": "string",
      "description": "The match ID to respond to."
    },
    "decline_reason": {
      "enum": [
        "wrong_skills",
        "stage_mismatch",
        "location",
        "not_enough_info",
        "already_found",
        "other"
      ],
      "type": "string",
      "description": "Why the user is declining. Only used when action is 'decline'."
    },
    "decline_reason_text": {
      "type": "string",
      "description": "Free-text detail when decline_reason is 'other'."
    }
  }
}
openmandate_respond_to_match annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
openmandate_submit_outcome
Advertised by the server during the last successful anonymous check.

Report how a confirmed match went. Available after both parties accepted and contact info was revealed. Outcomes: - 'succeeded': Found the right person. Mandate closes. - 'failed': Didn't work out. Mandate reactivates for new matches. - 'ongoing': Still in conversation. OpenMandate checks back later. IMPORTANT: Always confirm the outcome with the user before submitting. This affects their mandate and matching status.

openmandate_submit_outcome input schema
{
  "type": "object",
  "required": [
    "match_id",
    "outcome"
  ],
  "properties": {
    "outcome": {
      "enum": [
        "succeeded",
        "ongoing",
        "failed"
      ],
      "type": "string",
      "description": "Match outcome."
    },
    "match_id": {
      "type": "string",
      "description": "The match ID to report outcome for."
    }
  }
}
openmandate_submit_outcome annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
openmandate_list_contacts
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the user's verified contacts. These are the contacts revealed to the other party on match confirmation. Each contact has an ID, type, display label, and verification status.

openmandate_list_contacts input schema
{
  "type": "object",
  "required": [],
  "properties": {}
}
openmandate_list_contacts annotations
{
  "readOnlyHint": true,
  "destructiveHint": false
}
openmandate_add_contact
Advertised by the server during the last successful anonymous check.

Add a new contact for the user. A verification code (OTP) will be sent to the contact address. The user must verify the contact using openmandate_verify_contact before it can be used on mandates. The first contact added becomes the primary contact automatically.

openmandate_add_contact input schema
{
  "type": "object",
  "required": [
    "contact_type",
    "contact_value"
  ],
  "properties": {
    "contact_type": {
      "enum": [
        "email"
      ],
      "type": "string",
      "description": "Contact type."
    },
    "contact_value": {
      "type": "string",
      "description": "The contact address to add (e.g. email address)."
    },
    "display_label": {
      "type": "string",
      "description": "Optional human-readable label (e.g. 'Work email'). Defaults to the contact type."
    }
  }
}
openmandate_add_contact annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
openmandate_verify_contact
Advertised by the server during the last successful anonymous check.

Verify a contact by submitting the OTP code sent to it. The user must check their email for the 8-digit code. After verification, the contact can be used on mandates.

openmandate_verify_contact input schema
{
  "type": "object",
  "required": [
    "contact_id",
    "code"
  ],
  "properties": {
    "code": {
      "type": "string",
      "description": "The 8-digit verification code from the email."
    },
    "contact_id": {
      "type": "string",
      "description": "The contact ID to verify."
    }
  }
}
openmandate_verify_contact annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
openmandate_update_contact
Advertised by the server during the last successful anonymous check.

Update a contact's display label or set it as the primary contact. Setting a contact as primary will unset any other primary contact.

openmandate_update_contact input schema
{
  "type": "object",
  "required": [
    "contact_id"
  ],
  "properties": {
    "contact_id": {
      "type": "string",
      "description": "The contact ID to update."
    },
    "is_primary": {
      "type": "boolean",
      "description": "Set to true to make this the primary contact."
    },
    "display_label": {
      "type": "string",
      "description": "New display label for the contact."
    }
  }
}
openmandate_update_contact annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
openmandate_delete_contact
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a contact. If the deleted contact was primary, the next verified contact is automatically promoted. This is permanent.

openmandate_delete_contact input schema
{
  "type": "object",
  "required": [
    "contact_id"
  ],
  "properties": {
    "contact_id": {
      "type": "string",
      "description": "The contact ID to delete."
    }
  }
}
openmandate_delete_contact annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
openmandate_resend_otp
Advertised by the server during the last successful anonymous check.

Resend the verification code for a pending contact. Use this if the user didn't receive the code or it expired (codes expire after 10 minutes). Rate limited to 3 per contact per hour.

openmandate_resend_otp input schema
{
  "type": "object",
  "required": [
    "contact_id"
  ],
  "properties": {
    "contact_id": {
      "type": "string",
      "description": "The contact ID to resend verification for."
    }
  }
}
openmandate_resend_otp annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
394 ms
95th percentile latency
394 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 394 ms · metadata changed · 15 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http openmandate-mcp https://mcp.openmandate.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add openmandate-mcp --url https://mcp.openmandate.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable openmandate-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "openmandate-mcp": {
      "url": "https://mcp.openmandate.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "openmandate-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.openmandate.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start openmandate-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "openmandate-mcp": {
      "type": "http",
      "url": "https://mcp.openmandate.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http openmandate-mcp https://mcp.openmandate.ai/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.openmandate.ai/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "openmandate-mcp": {
      "serverUrl": "https://mcp.openmandate.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like OpenMandate MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run OpenMandate MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing