request_intro
Propose a connection to a matched user by sending a message. Approval from both sides is required before exchanging personal information.
Instructions
Reach out to someone you matched with on Mingle. Send a message explaining why you'd be a good connection. Nothing personal crosses until both sides say yes.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | Match ID from search_matches | |
| to | Yes | Agent ID of the person you want to meet | |
| message | Yes | Short message explaining why this intro would be valuable |
Implementation Reference
- src/index.ts:319-362 (registration)Registration of the request_intro tool on the MCP server with its schema (match_id, to, message) and handler callback.
server.tool( "request_intro", "Reach out to someone you matched with on Mingle. Send a message explaining why you'd be a good connection. Nothing personal crosses until both sides say yes.", { match_id: z.string().describe("Match ID from search_matches"), to: z.string().describe("Agent ID of the person you want to meet"), message: z.string().describe("Short message explaining why this intro would be valuable"), }, async (args) => { try { const introBody: Record<string, any> = { matchId: args.match_id, targetAgentId: args.to, message: args.message, fieldsToDisclose: ["needs", "offers"], agentId, publicKey: keys.publicKey, }; introBody.signature = sign(canonicalize(introBody), keys.privateKey); const result = await api("/api/intros", { method: "POST", body: JSON.stringify(introBody), }); if (result.error) return { content: [{ type: "text" as const, text: `Failed: ${result.error}` }], isError: true }; const digest = await fetchDigest(); return { content: [{ type: "text" as const, text: withDigest({ introId: result.introId, status: "pending", to: args.to, note: "Intro request sent. They'll see it in their digest.", }, digest), }], }; } catch (e: any) { return { content: [{ type: "text" as const, text: `Network error: ${e.message}` }], isError: true }; } } ); - src/index.ts:327-361 (handler)Handler function for request_intro: constructs an intro body with matchId, targetAgentId, message, fieldsToDisclose, agentId, and publicKey, signs it, POSTs to /api/intros, and returns the result with a digest.
async (args) => { try { const introBody: Record<string, any> = { matchId: args.match_id, targetAgentId: args.to, message: args.message, fieldsToDisclose: ["needs", "offers"], agentId, publicKey: keys.publicKey, }; introBody.signature = sign(canonicalize(introBody), keys.privateKey); const result = await api("/api/intros", { method: "POST", body: JSON.stringify(introBody), }); if (result.error) return { content: [{ type: "text" as const, text: `Failed: ${result.error}` }], isError: true }; const digest = await fetchDigest(); return { content: [{ type: "text" as const, text: withDigest({ introId: result.introId, status: "pending", to: args.to, note: "Intro request sent. They'll see it in their digest.", }, digest), }], }; } catch (e: any) { return { content: [{ type: "text" as const, text: `Network error: ${e.message}` }], isError: true }; } } - src/index.ts:322-326 (schema)Input schema for request_intro: match_id (string), to (string - agent ID), message (string).
{ match_id: z.string().describe("Match ID from search_matches"), to: z.string().describe("Agent ID of the person you want to meet"), message: z.string().describe("Short message explaining why this intro would be valuable"), },